该题第一次写就AC
题意
每个学生有三门成绩以及一个成绩的平均分,对每个查询给出这名学生获得最高名次的科目及排名
思路
由于科目少只有固定数目的4个,以及查询次数多最多有2k次。所以输入所有学生信息后,查询前先排四次序,把每名学生每个科目的的名次存在学生结构体中。然后每次查询遍历每个学生的长度为4的排名数组即可。
注意点
对四门科目的排序是重复动作,所以用了一个for
循环使用sort()
进行排序,通过一个全局变量i
来实现。
AC代码
#include<iostream>
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct stu{
string id;
int score[4];
int rank[4];
};
int cnt;
bool cmp(stu a,stu b){
return a.score[cnt]>b.score[cnt];
}
char ab[4] = {'A','C','M','E'};
map<string,int> book;
int main(){
int n,m;
scanf("%d%d",&n,&m);
vector<stu> list(n);
for(int i=0;i<n;i++){
cin>>list[i].id;
scanf("%d %d %d",&list[i].score[1],&list[i].score[2],&list[i].score[3]);
list[i].score[0] = 1.0*(list[i].score[1]+list[i].score[2]+list[i].score[3])/3.0+0.5;
}
for(cnt=0;cnt<4;cnt++){
sort(list.begin(),list.end(),cmp);
list[0].rank[cnt]=1;
for(int i=1;i<n;i++){
if(list[i].score[cnt]==list[i-1].score[cnt])
list[i].rank[cnt] = list[i-1].rank[cnt];
else list[i].rank[cnt] = i+1;
}
}
for(int i=0;i<n;i++){
book[list[i].id]=i;
}
for(int i=0;i<m;i++){
string name;
cin>>name;
if(book.find(name)==book.end()){
printf("N/A\n");
continue;
}
int id = book[name];
int hrank=list[id].rank[0],hrankIn=0;
for(int i=1;i<4;i++){
if(list[id].rank[i]<hrank){
hrank = list[id].rank[i];hrankIn=i;
}
}
printf("%d %c\n",hrank,ab[hrankIn]);
}
return 0;
}