想法:这道题没想出啥更优的方法,就是排序然后查找。
第一次提交没注意以下情况:
排名相同的情况
#include<iostream>
#include<iomanip>
#include<vector>
#include<algorithm>
using namespace std;
typedef struct
{
int id;
int g[4];
int r[4];
}student;
student s[2005];
bool cmp0(student a,student b){
return a.g[0]>b.g[0];
}
bool cmp1(student a,student b){
return a.g[1]>b.g[1];
}
bool cmp2(student a,student b){
return a.g[2]>b.g[2];
}
bool cmp3(student a,student b){
return a.g[3]>b.g[3];
}
int main()
{
//student s[2005];
int query_id[2005];
int n,m;
cin>>n>>m;
for(int i=0; i<n; i++){
cin>>s[i].id>>s[i].g[1]>>s[i].g[2]>>s[i].g[3];
s[i].g[0]=(s[i].g[1]+s[i].g[2]+s[i].g[3])/3;
}
for(int i=0; i<m; i++){
cin>>query_id[i];
}
sort(s,s+n,cmp0);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++){
if(query_id[i]==s[j].id){
s[j].r[0]=j+1;
int k=1;
while(s[j-k].g[0]==s[j].g[0]){
s[j].r[0]--;
k++;
}
break;
}
}
sort(s,s+n,cmp1);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++){
if(query_id[i]==s[j].id){
s[j].r[1]=j+1;
int k=1;
while(s[j-k].g[1]==s[j].g[1]){
s[j].r[1]--;
k++;
}
break;
}
}
sort(s,s+n,cmp2);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++){
if(query_id[i]==s[j].id){
s[j].r[2]=j+1;
int k=1;
while(s[j-k].g[2]==s[j].g[2]){
s[j].r[2]--;
k++;
}
break;
}
}
sort(s,s+n,cmp3);
for(int i=0; i<m; i++)
for(int j=0; j<n; j++){
if(query_id[i]==s[j].id){
s[j].r[3]=j+1;
int k=1;
while(s[j-k].g[3]==s[j].g[3]){
s[j].r[3]--;
k++;
}
break;
}
}
for(int i=0; i<m; i++){
max_rank(query_id[i],n);
}
return 0;
}