简单排序题。
注意:分数相同的人排名相同。
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<map> using namespace std; struct X { int k; int id; int f1,f2,f3,f4; int r[6]; }s[5000]; int n,m; map<int,int>z; int get(int a,int b,int c) { double sum=1.0*a+1.0*b+1.0*c; sum=sum/3+0.5; int res=(int)sum; return res; } bool cmp1(const X&a,const X&b){return a.f1>b.f1;} bool cmp2(const X&a,const X&b){return a.f2>b.f2;} bool cmp3(const X&a,const X&b){return a.f3>b.f3;} bool cmp4(const X&a,const X&b){return a.f4>b.f4;} bool cmp5(const X&a,const X&b){return a.k<b.k;} int main() { scanf("%d%d",&n,&m); z.clear(); for(int i=1;i<=n;i++) { scanf("%d%d%d%d",&s[i].id,&s[i].f2,&s[i].f3,&s[i].f4); s[i].f1=get(s[i].f2,s[i].f3,s[i].f4); z[s[i].id]=i; s[i].k=i; } s[0].f1=s[0].f2=s[0].f3=s[0].f4=-456; sort(s+1,s+1+n,cmp1); for(int i=1;i<=n;i++) { if(s[i].f1==s[i-1].f1) s[i].r[1]=s[i-1].r[1]; else s[i].r[1]=i; } sort(s+1,s+1+n,cmp2); for(int i=1;i<=n;i++) { if(s[i].f2==s[i-1].f2) s[i].r[2]=s[i-1].r[2]; else s[i].r[2]=i; } sort(s+1,s+1+n,cmp3); for(int i=1;i<=n;i++) { if(s[i].f3==s[i-1].f3) s[i].r[3]=s[i-1].r[3]; else s[i].r[3]=i; } sort(s+1,s+1+n,cmp4); for(int i=1;i<=n;i++) { if(s[i].f4==s[i-1].f4) s[i].r[4]=s[i-1].r[4]; else s[i].r[4]=i; } sort(s+1,s+1+n,cmp5); for(int i=1;i<=m;i++) { int id; scanf("%d",&id); if(z[id]==0) printf("N/A "); else { int Min=9999; for(int j=1;j<=4;j++) Min=min(Min,s[z[id]].r[j]); for(int j=1;j<=4;j++) { if(s[z[id]].r[j]==Min) { printf("%d ",Min); if(j==1) printf("A "); if(j==2) printf("C "); if(j==3) printf("M "); if(j==4) printf("E "); break; } } } } return 0; }