题意:Ahmad是最厉害的acmer,他的排名是0,所有与他组队打比赛的人的排名都是1,没有和他组过队但是和排名为1的人组过对的人排名为2,以此类推求出所有可以求得排名的人的排名,按排名小到大的顺序输出,如果排名相同按字典序小到大输出,最后按名字字典序小到达输出不能求得排名的
思路:暴力依次求出排名为1,2,3.。。。当求排名为3的时候,如果某人的排名为1,则这个人的答案不更新,Ahmad的排名不更新,求出所有答案后放入set[i]数组里,i用来标记排名,最后输出答案
AC代码:
#include "iostream" #include "string.h" #include "stack" #include "queue" #include "string" #include "vector" #include "set" #include "map" #include "algorithm" #include "stdio.h" #include "math.h" #define ll long long #define bug(x) cout<<x<<" "<<"UUUUU"<<endl; #define mem(a) memset(a,0,sizeof(a)) #define mp(x,y) make_pair(x,y) using namespace std; const long long INF = 1e18+1LL; const int inf = 1e9+1e8; const int N=1e5+100; ///2015 HIAST Collegiate Programming Contest ///FFFF set<string> se[305]; map<string,int> ans,M; map<int,string> Mb; string s1,s2,s3,s0[105][5]; int t,n; int main(){ cin>>t; while(t--){ cin>>n; int cnt=0; ans.clear(); Mb.clear(); M.clear(); for(int i=0; i<=303; ++i) se[i].clear(); ans["Ahmad"]=0; for(int i=1; i<=n; ++i){ cin>>s1>>s2>>s3; s0[i][1]=s1,s0[i][2]=s2,s0[i][3]=s3; M[s1]=++cnt,Mb[cnt]=s1; M[s2]=++cnt,Mb[cnt]=s2; M[s3]=++cnt,Mb[cnt]=s3; if(s1=="Ahmad"){ ans[s2]=1,ans[s3]=1; } else if(s2=="Ahmad"){ ans[s1]=1,ans[s3]=1; } else if(s3=="Ahmad"){ ans[s1]=1,ans[s2]=1; } } int rk=1; while(rk<300){ for(int i=1; i<=cnt; i++){ string s=Mb[i]; if(ans[s]==rk){ for(int i=1; i<=n; ++i){ if(s0[i][1]==s){ if(!ans[s0[i][2]] && s0[i][2]!="Ahmad") ans[s0[i][2]]=rk+1; if(!ans[s0[i][3]] && s0[i][3]!="Ahmad") ans[s0[i][3]]=rk+1; } if(s0[i][2]==s){ if(!ans[s0[i][1]] && s0[i][1]!="Ahmad") ans[s0[i][1]]=rk+1; if(!ans[s0[i][3]] && s0[i][3]!="Ahmad") ans[s0[i][3]]=rk+1; } if(s0[i][3]==s){ if(!ans[s0[i][1]] && s0[i][1]!="Ahmad") ans[s0[i][1]]=rk+1; if(!ans[s0[i][2]] && s0[i][2]!="Ahmad") ans[s0[i][2]]=rk+1; } } } } rk++; int f=1; for(int i=1; i<=cnt; i++){ string s=Mb[i]; if(!ans[s] && s!="Ahmad"){ f=0; break; } } if(f) break; } for(int i=1; i<=cnt; ++i){ string s=Mb[i]; if(ans[s]==0) ans[s]=302; } ans["Ahmad"]=0; for(int i=0; i<=cnt; ++i){ string s=Mb[i]; se[ans[s]].insert(s); } cout<<M.size()<<endl; if(M["Ahmad"]) cout<<"Ahmad"<<" "<<0<<endl; for(int i=1; i<300; ++i){ if(se[i].size()==0) break; set<string>::iterator it; for(it=se[i].begin(); it!=se[i].end(); it++){ cout<<(*it)<<" "<<i<<endl; } } set<string>::iterator it; for(it=se[302].begin(); it!=se[302].end(); it++){ cout<<(*it)<<" "<<"undefined"<<endl; } } return 0; }