2015 HIAST Collegiate Programming Contest F

Contestants Ranking

题意: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;
}
原文地址:https://www.cnblogs.com/max88888888/p/7161895.html