想清楚了就不难 这题还是在c程上机课的时候a掉的
还是aaa和vv的命名,本家独创 还是只会举例论证,wztcl
描述 hzy很喜欢了解歌曲的排行榜,他每次都从XX网站获知。 由于这个网站想对这个歌曲的排行榜含蓄的告诉大家,组织了一个“猜榜大赛”。 这个网站宣布一些歌曲的信息,那些歌曲在歌曲榜上的前几名,例如: ·”qianlizhiwai” 是在榜上的前三名 ·”qianlizhiwai”,”dachengxiaoai” 是在歌曲榜的前两名 网站不会把歌曲的名次十分明确的告诉你,他就是想让你通过这些信息,推出一部分歌曲的名次,现在困惑的hzy找您帮忙,想让您推出所有确定名次的歌曲。 输入 第一行包括一个整数n, 1≤n≤500,表示网站给你的信息的条数。 下面n行包括一条信息,形式为”A and B song1 song2 song3 … songA”,1≤A≤B≤100,表示”song1”,”song2”,…,”songA”是在歌曲榜的前B位。 每一首歌都是一个string,由最多25个小写字母组成。 输出 输出可以知道的所有的歌的排名,形式:”Position Song”位置必须有序。 输入样例 1 2 1 and 3 lonely 2 and 2 trebami jasekonja 输出样例 1 3 lonely 输入样例 2 3 2 and 2 pjesma1 pjesma2 3 and 4 pjesma1 pjesma3 pjesma4 1 and 3 pjesma4 输出样例 2 3 pjesma4 4 pjesma3
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<iostream>
#include<map>
#include<string>
#include<vector>
#include<sstream>
#define INF 0xfffffff
using namespace std;
int n, m, k;
int a, b, c, d;
int sum, ans, num, cnt[105];
string s, sa, sb;
map<string, int>aaa;
vector<string>vv[105];
vector<string>::iterator it;
int main() {
num = 0;
aaa.clear();
for (int i = 1; i < 105; i++)
vv[i].clear();
cin >> n;
int tmp = INF;
while (n--) {
cin >> k >> s >> m;
while (k--) {
cin >> s;
if (!aaa[s])
aaa[s] = m, vv[m].push_back(s);
else if (aaa[s] > m){
for(it=vv[aaa[s]].begin();it!=vv[aaa[s]].end();)
if(*it==s) it=vv[aaa[s]].erase(it);
else it++;
vv[m].push_back(s);
aaa[s] = m;
}
}
}
for (int i = 1; i < 105; i++){
num+=vv[i].size();
//没有num遇到1 1 and 3 lonely这种情况会输出3 lonely(正确是没有输出)
if (vv[i].size() == 1&&num==i)
cout << i << " " << vv[i][0] << endl;
}
return 0;
}
感觉没什么太难理解的不必要打什么注释= =