题目:1012 The Best Rank (25 分)
题解:先将四种成绩按从大到小排序,然后对每次询问去二分查找对应成绩的位置,(按,a,c,m,e的次序进行即可)
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<double,int> PII;
const int N=2010;
const int mod=100000007;
unordered_map<int ,int>mp;
typedef struct Node{
int id;
int scores[5];
}node;
int n,M;
int a[N],c[N],m[N],e[N];
node q[N];
bool cmp(int x,int y){
return x>y;
}
int findd(int b[],int x){
int l=0,r=n-1;
while(l<r){
int mid=l+r>>1;
if(b[mid]<=x)r=mid;
else l=mid+1;
//cout<<mid<<" ";
}
//cout<<endl;
return l;
}
int main(){
cin>>n>>M;
for(int i=0;i<n;i++){
cin>>q[i].id>>q[i].scores[1]>>q[i].scores[2]>>q[i].scores[3];
q[i].scores[0]=round((q[i].scores[1]+q[i].scores[2]+q[i].scores[3])*1.0/3);
mp[q[i].id]=i;
a[i]=q[i].scores[0],c[i]=q[i].scores[1],m[i]=q[i].scores[2],e[i]=q[i].scores[3];
}
sort(a,a+n,cmp);
sort(c,c+n,cmp);
sort(m,m+n,cmp);
sort(e,e+n,cmp);
//for(int i=0;i<n;i++)
// cout<<c[i]<<" ";
//cout<<endl;
for(int i=0;i<M;i++){
int fid;
cin>>fid;
if(mp.find(fid)==mp.end()) cout<<"N/A";
else{
char idx;
int rak=N;
//cout<<mp[fid]<<" "<<fid<<endl;
int x=q[mp[fid]].scores[0];
int tmp=findd(a,x);
if(rak>tmp) rak=tmp,idx='A';
//cout<<rak<<endl;
x=q[mp[fid]].scores[1];
tmp=findd(c,x);
if(rak>tmp) rak=tmp,idx='C';
//cout<<rak<<endl;
x=q[mp[fid]].scores[2];
tmp=findd(m,x);
if(rak>tmp) rak=tmp,idx='M';
//cout<<rak<<endl;
x=q[mp[fid]].scores[3];
tmp=findd(e,x);
if(rak>tmp) rak=tmp,idx='E';
printf("%d %c",rak+1,idx);
}
if(i!=M-1) cout<<endl;
}
return 0;
}