排序,水题
因为最后如果一个学生最好的排名有一样的,输出的课程有个优先级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; }