ZJU PAT 1012 The Best Rank

来源:互联网 发布:php是最好的语言出处 编辑:程序博客网 时间:2024/05/22 11:49
#include<iostream>#include<string>#include<algorithm>#include<cstdio>using namespace std;#define Min(a,b)(a<b?a:b)int n,m;struct student{int id,ctest,math,english;double avg;int crank,mrank,erank,arank;int bestrank;string bsetrankname;};student TT[2005];bool cmpa(student a,student b){return a.avg>b.avg;}bool cmpc(student a,student b){return a.ctest>b.ctest;}bool cmpm(student a,student b){return a.math>b.math;}bool cmpe(student a,student b){return a.english>b.english;}void MakeaRank(){for(int i=0;i<n;i++){if(i==0) {TT[i].arank=1;continue;}if(TT[i].avg!=TT[i-1].avg){TT[i].arank=i+1;}else{TT[i].arank=TT[i-1].arank;}}}void MakecRank(){for(int i=0;i<n;i++){if(i==0) {TT[i].crank=1;continue;}if(TT[i].ctest!=TT[i-1].ctest){TT[i].crank=i+1;}else{TT[i].crank=TT[i-1].crank;}}}void MakemRank(){for(int i=0;i<n;i++){if(i==0) {TT[i].mrank=1;continue;}if(TT[i].math!=TT[i-1].math){TT[i].mrank=i+1;}else{TT[i].mrank=TT[i-1].mrank;}}}void MakeeRank(){for(int i=0;i<n;i++){if(i==0) {TT[i].erank=1;continue;}if(TT[i].english!=TT[i-1].english){TT[i].erank=i+1;}else{TT[i].erank=TT[i-1].erank;}}}void MakeBest(){for(int i=0;i<n;i++){int tmp=TT[i].arank;string ss="A";if(TT[i].crank<tmp){tmp=TT[i].crank;ss="C";}if(TT[i].mrank<tmp){tmp=TT[i].mrank;ss="M";}if(TT[i].erank<tmp){tmp=TT[i].erank;ss="E";}TT[i].bestrank=tmp;TT[i].bsetrankname=ss;}}void run(){int i,j;for(i=0;i<n;i++) {scanf("%d%d%d%d",&TT[i].id,&TT[i].ctest,&TT[i].math,&TT[i].english);TT[i].avg=(TT[i].ctest+TT[i].math+TT[i].english)*1.0/3.0;}//----cmp by avg-----------sort(TT,TT+n,cmpa);MakeaRank();//----cmp by ctest-----------sort(TT,TT+n,cmpc);MakecRank();//----cmp by math------------sort(TT,TT+n,cmpm);MakemRank();//----cmp by english------------sort(TT,TT+n,cmpe);MakeeRank();//----cmp by math------------sort(TT,TT+n,cmpa);MakeaRank();MakeBest();int curid;for(i=0;i<m;i++){scanf("%d",&curid);for(j=0;j<n;j++){if(TT[j].id==curid){printf("%d %s\n",TT[j].bestrank,TT[j].bsetrankname.c_str());break;}}if(j==n)printf("N/A\n");}}int main(){while(scanf("%d%d",&n,&m)!=EOF) run();return 0;}

给出学生3门课的成绩,求每名学生在3门课以及平均分中所能取得的最高排名。

注意:并列排名的处理上:应该是1 2 3 3 5,而不是1 2 3 3 4