导言
题目不赘述,直接上思路+代码。本题是复现晴神笔记思想。
要点
首先定义题目,属于排序题,C++排序题建议使用sort函数来排序。
1.观察输入条件,ID+C+M+E数据,观察输出条件,优先级A > C > M > E,为方便起见定义数组grade[4]来存储
2.大数组定义在main函数外。因为main函数开辟的内存空间有限
3.比较函数中虽然没有传入now,但是now可以作为全局变量出现在比较函数中
4.若二人并列第一,则二人都是第一,则第二不存在,接下来的就是第三
5.因平均数无出现必要,排序可以直接用和,还避免平均数精度的意外
代码
#include<bits/stdc++.h>
using namespace std;
struct student{
int id;
int grade[4];
}stu[2010];
int now;//全局变量的功劳
char ans[4]={'A','C','M','E'};
int ranking[10000000][4]={0};
bool cmp(student a, student b){
return a.grade[now]>b.grade[now];
}
int main(){
int N,M;
cin>>N>>M;
for(int i=0;i<N;i++){
cin>>stu[i].id>>stu[i].grade[1]>>stu[i].grade[2]>>stu[i].grade[3];
stu[i].grade[0]=stu[i].grade[1]+stu[i].grade[2]+stu[i].grade[3];
}
for(now=0;now<4;now++){
sort(stu,stu+N,cmp);
ranking[stu[0].id][now]=1;
for(int i=1;i<N;i++){
if(stu[i].grade[now]==stu[i-1].grade[now])
ranking[stu[i].id][now]=ranking[stu[i-1].id][now];
else
ranking[stu[i].id][now]=i+1;
}
}
int query;
for(int i=0;i<M;i++){
cin>>query;
int min;
if(!ranking[query][0])
cout<<"N/A"<<endl;
else{
min=1000;
int minnumber;
for(int j=0;j<4;j++){
if(ranking[query][j]<min){
min=ranking[query][j];
minnumber=j;}
}
cout<<min<<" "<<ans[minnumber]<<endl;
}
}
return 0;
}