题意:
输入两个整数N,M(<=2000),接着分别输入N个学生的ID,C语言成绩,数学成绩和英语成绩。
M次询问,每次输入学生ID,如果该ID不存在则输出N/A,存在则输出该学生排名最考前的一门成绩的名次和课程编号。优先级:A>C>M>E。A代表CMD三门课的平均成绩(操作时可用总成绩来替代平均成绩处理)。
trick:
成绩相同时将其名次合并(多个学生并列)
AAAAAccepted code:
1 #include<bits/stdc++.h> 2 using namespace std; 3 string s[2007]; 4 int c[2007],m[2007],e[2007],a[2007]; 5 pair<int,int>cc[2007],mm[2007],ee[2007],aa[2007]; 6 int rak[2007],rak_c[2007],rak_m[2007],rak_e[2007],rak_a[2007]; 7 char ans[2007]; 8 map<string,int>mp; 9 bool cmp(pair<int,int>a,pair<int,int>b){ 10 return a.first>b.first; 11 } 12 int main(){ 13 int n,q; 14 cin>>n>>q; 15 for(int i=1;i<=n;++i){ 16 cin>>s[i]>>c[i]>>m[i]>>e[i]; 17 a[i]=c[i]+m[i]+e[i]; 18 cc[i].first=c[i]; 19 cc[i].second=i; 20 mm[i].first=m[i]; 21 mm[i].second=i; 22 ee[i].first=e[i]; 23 ee[i].second=i; 24 aa[i].first=a[i]; 25 aa[i].second=i; 26 mp[s[i]]=i; 27 } 28 sort(cc+1,cc+1+n,cmp); 29 sort(mm+1,mm+1+n,cmp); 30 sort(ee+1,ee+1+n,cmp); 31 sort(aa+1,aa+1+n,cmp); 32 for(int i=1;i<=n;++i){ 33 rak_c[i]=i; 34 if(cc[i].first==cc[i-1].first) 35 rak_c[i]=rak_c[i-1]; 36 rak_m[i]=i; 37 if(mm[i].first==mm[i-1].first) 38 rak_m[i]=rak_m[i-1]; 39 rak_e[i]=i; 40 if(ee[i].first==ee[i-1].first) 41 rak_e[i]=rak_e[i-1]; 42 rak_a[i]=i; 43 if(aa[i].first==aa[i-1].first) 44 rak_a[i]=rak_a[i-1]; 45 } 46 for(int i=1;i<=n;++i){ 47 rak[aa[i].second]=rak_a[i]; 48 ans[aa[i].second]='A'; 49 } 50 for(int i=1;i<=n;++i) 51 if(rak_c[i]<rak[cc[i].second]){ 52 rak[cc[i].second]=rak_c[i]; 53 ans[cc[i].second]='C'; 54 } 55 for(int i=1;i<=n;++i) 56 if(rak_m[i]<rak[mm[i].second]){ 57 rak[mm[i].second]=rak_m[i]; 58 ans[mm[i].second]='M'; 59 } 60 for(int i=1;i<=n;++i) 61 if(rak_e[i]<rak[ee[i].second]){ 62 rak[ee[i].second]=rak_e[i]; 63 ans[ee[i].second]='E'; 64 } 65 string quy; 66 for(int i=1;i<=q;++i){ 67 cin>>quy; 68 if(!mp[quy]) 69 cout<<"N/A"<<" "; 70 else 71 cout<<rak[mp[quy]]<<" "<<ans[mp[quy]]<<" "; 72 } 73 return 0; 74 }