描述
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
没有思路的题 参考了队里大佬的做法:
先用map取每个人最靠前的名次(显然 如果某个人被限定到更前面的名次 那么其后面的名次没有意义)
然后 遍历map 将名次相同的push进一个vector
mp里的first为【】里的 second为右边的
最后从一 开始遍历所有名次
如果当前上榜歌曲总数等于排名且当前排名的歌曲唯一 那么它的排名就可以确定!
#include<bits/stdc++.h> using namespace std; //input #define rep(i,x,y) for(int i=(x);i<=(y);++i) #define RI(n) scanf("%d",&(n)) #define RII(n,m) scanf("%d%d",&n,&m); #define RIII(n,m,k) scanf("%d%d%d",&n,&m,&k) #define RS(s) scanf("%s",s) #define LL long long #define REP(i,N) for(int i=0;i<(N);i++) #define CLR(A,v) memset(A,v,sizeof A) ////////////////////////////////// #define N 2050 #define inf -0x3f3f3f3f map<string,int>mp;vector<string>v[105]; int n,tot; int main() { RI(n); rep(i,1,n) { int a,b;string str; RI(a); cin>>str; RI(b); while(a--) { cin>>str; if(!mp.count(str))mp[str]=b; else mp[str]=min(mp[str],b ); } } map<string,int>::iterator it; for(it=mp.begin();it!=mp.end();it++) v[it->second].push_back(it->first); tot=0; rep(i,1,100) { tot+=v[i].size(); if(v[i].size()==1&&tot==i) cout<<i<<" "<<v[i][0]<<endl; } }