PAT A 1025 Ranking

注意:在写cmp函数时,按照c语言的写法,应该用strcmp来进行大小比较,如果直接用>或<会出错。

bool cmp(const Node &a,const Node &b){
    if(a.score==b.score) return strcmp(a.id,b.id)<0;
    return a.score>b.score;
}

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e4+10;
struct Node{
    char id[15];//表示ID
    int score;//表示总分
    int group;//表示组号
    int final_rank;//最后的排名
    int local_rank;//小组排名
};
Node p[maxn];
bool cmp(const Node &a,const Node &b){
    if(a.score==b.score) return strcmp(a.id,b.id)<0;
    return a.score>b.score;
}
int main()
{
    int n,k;
    scanf("%d",&n);
    int cnt=0,rank=1;
    for(int i=1;i<=n;i++){
        scanf("%d",&k);
        for(int j=0;j<k;j++){
            scanf("%s %d",p[cnt].id,&p[cnt].score);
            p[cnt++].group=i;
        }
        sort(p+cnt-k,p+cnt,cmp);
        p[cnt-k].local_rank=1;
        rank=1;
        for(int j=cnt-k+1;j<cnt;j++){
            ++rank;
            if(p[j].score==p[j-1].score){
                p[j].local_rank=p[j-1].local_rank;
            }else{
                p[j].local_rank=rank;
            }
        }
    }
    sort(p,p+cnt,cmp);
    p[0].final_rank=1;
    rank=1;
    for(int i=1;i<cnt;i++){
        ++rank;
        if(p[i].score==p[i-1].score){
            p[i].final_rank=p[i-1].final_rank;
        }else{
            p[i].final_rank=rank;
        }
    }
    printf("%d\n",cnt);
    for(int i=0;i<cnt;i++){
        printf("%s %d %d %d\n",p[i].id,p[i].final_rank,p[i].group,p[i].local_rank);
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40420192/article/details/113797361