题意:
输入两个整数N,M(<=2000),接着分别输入N个学生的ID,C语言成绩,数学成绩和英语成绩。
M次询问,每次输入学生ID,如果该ID不存在则输出N/A,存在则输出该学生排名最考前的一门成绩的名次和课程编号。优先级:A>C>M>E。A代表CMD三门课的平均成绩(操作时可用总成绩来替代平均成绩处理)。
trick:
成绩相同时将其名次合并(多个学生并列)
代码:
#include<bits/stdc++.h>
using namespace std;
string s[2007];
int c[2007],m[2007],e[2007],a[2007];
pair<int,int>cc[2007],mm[2007],ee[2007],aa[2007];
int rak[2007],rak_c[2007],rak_m[2007],rak_e[2007],rak_a[2007];
char ans[2007];
map<string,int>mp;
bool cmp(pair<int,int>a,pair<int,int>b){
return a.first>b.first;
}
int main(){
int n,q;
cin>>n>>q;
for(int i=1;i<=n;++i){
cin>>s[i]>>c[i]>>m[i]>>e[i];
a[i]=c[i]+m[i]+e[i];
cc[i].first=c[i];
cc[i].second=i;
mm[i].first=m[i];
mm[i].second=i;
ee[i].first=e[i];
ee[i].second=i;
aa[i].first=a[i];
aa[i].second=i;
mp[s[i]]=i;
}
sort(cc+1,cc+1+n,cmp);
sort(mm+1,mm+1+n,cmp);
sort(ee+1,ee+1+n,cmp);
sort(aa+1,aa+1+n,cmp);
for(int i=1;i<=n;++i){
rak_c[i]=i;
if(cc[i].first==cc[i-1].first)
rak_c[i]=rak_c[i-1];
rak_m[i]=i;
if(mm[i].first==mm[i-1].first)
rak_m[i]=rak_m[i-1];
rak_e[i]=i;
if(ee[i].first==ee[i-1].first)
rak_e[i]=rak_e[i-1];
rak_a[i]=i;
if(aa[i].first==aa[i-1].first)
rak_a[i]=rak_a[i-1];
}
for(int i=1;i<=n;++i){
rak[aa[i].second]=rak_a[i];
ans[aa[i].second]='A';
}
for(int i=1;i<=n;++i){
if(rak_c[i]<rak[cc[i].second]){
rak[cc[i].second]=rak_c[i];
ans[cc[i].second]='C';
}
}
for(int i=1;i<=n;++i){
if(rak_m[i]<rak[mm[i].second]){
rak[mm[i].second]=rak_m[i];
ans[mm[i].second]='M';
}
}
for(int i=1;i<=n;++i){
if(rak_e[i]<rak[ee[i].second]){
rak[ee[i].second]=rak_e[i];
ans[ee[i].second]='E';
}
}
string quy;
for(int i=1;i<=q;++i){
cin>>quy;
if(!mp[quy])
cout<<"N/A"<<"\n";
else
cout<<rak[mp[quy]]<<" "<<ans[mp[quy]]<<"\n";
}
return 0;
}