#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