PAT甲题题解-1012. The Best Rank (25)-排序水题

排序,水题
因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级A>C>M>E
那么按这个优先级顺序进行排序
每次排序前先求当前课程的排名
然后再与目前最好的排名比较、更新

至于查询,建立id与索引的映射即可。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int maxn=2000+5;
int n,m;
map<string,int> maps;
struct Stu{
    char id[10];
    int score[4];
    int ranks;
    int best_rank=5000;
    int c;
}stu[maxn];

bool cmp1(Stu a,Stu b){
    return a.score[0]>b.score[0];
}
bool cmp2(Stu a,Stu b){
    return a.score[1]>b.score[1];
}
bool cmp3(Stu a,Stu b){
    return a.score[2]>b.score[2];
}
bool cmp4(Stu a,Stu b){
    return a.score[3]>b.score[3];
}

void solveRanks(int k){
    stu[0].ranks=1;
    if(stu[0].ranks<stu[0].best_rank){
        stu[0].best_rank=stu[0].ranks;
        stu[0].c=k;
    }
    for(int i=1;i<n;i++){
        if(stu[i].score[k]==stu[i-1].score[k]){
            stu[i].ranks=stu[i-1].ranks;
        }
        else{
            stu[i].ranks=i+1;
        }
        if(stu[i].ranks<stu[i].best_rank){
            stu[i].best_rank=stu[i].ranks;
            stu[i].c=k;
        }
    }
}
int main()
{
    scanf("%d %d",&n,&m);
    for(int i=0;i<n;i++){
        scanf("%s %d %d %d",stu[i].id,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
        stu[i].score[3]=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3;
    }
    sort(stu,stu+n,cmp4);
    solveRanks(3);

    sort(stu,stu+n,cmp1);
    solveRanks(0);

    sort(stu,stu+n,cmp2);
    solveRanks(1);

    sort(stu,stu+n,cmp3);
    solveRanks(2);

    string str;
    for(int i=0;i<n;i++){
        str=stu[i].id;
        maps[str]=i+1;
    }
    char course[4]={'C','M','E','A'};
    for(int i=0;i<m;i++){
        cin>>str;
        int idx=maps[str]-1;
        if(idx==-1)
            printf("N/A
");
        else
            printf("%d %c
",stu[idx].best_rank,course[stu[idx].c]);
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/chenxiwenruo/p/6727969.html