pat甲级打卡-1012 The Best Rank

这题有点复杂,参考了柳神的代码
要搞清楚这里面的结构体

#include<bits/stdc++.h>
using namespace std;
struct Stu{
    int id,best;//best是最好排名的学科index
    int score[4],rank[4];
}stus[2010];
int n,m,flag=-1;

int exist[1000000];
bool cmp(Stu a,Stu b){
    return a.score[flag] > b.score[flag];
}
int main(){
    cin>>n>>m;
    for(int i=0;i<n;i++){
        scanf("%d %d %d %d", &stus[i].id, &stus[i].score[1], &stus[i].score[2], &stus[i].score[3]);
        stus[i].score[0]=(stus[i].score[1]+stus[i].score[2]+stus[i].score[3]) / 3.0 +0.5;    //4舍5入        
    }

    for(flag = 0; flag <= 3; flag++) {
        sort(stus, stus + n, cmp);
        stus[0].rank[flag] = 1;
        for(int i = 1; i < n; i++) {
            stus[i].rank[flag] = i + 1;
            if(stus[i].score[flag] == stus[i-1].score[flag])
                stus[i].rank[flag] = stus[i-1].rank[flag];
        }
    }

    for(int i=0;i<n;i++){
        exist[stus[i].id]=i+1;
        stus[i].best=0; //最高的一项成绩排名
        int minn=stus[i].rank[0];
        for(int j=1;j<=3;j++){
            
            if(stus[i].rank[j]<minn) {minn=stus[i].rank[j];stus[i].best=j;}
        }
    }
    
    char c[5]={'A','C','M','E'};
    for(int i=0;i<m;i++){
        int id;
        cin>>id;
        int tmp=exist[id];
        if(tmp){
            int best=stus[tmp-1].best;
            cout<<stus[tmp-1].rank[best]<<" "<<c[best]<<endl;
        }else cout<<"N/A"<<endl;
    }
    
    
    return 0;
}
posted @ 2022-04-30 21:08  秋月桐  阅读(21)  评论(0编辑  收藏  举报