题目简述
现已知n个考生的3门课分数C、M、E,而平均分数A可以由这3个分数得到。现在分别按这4个分数对n个考生从高到低排序,这样对每个考生来说,就会有4个排名且每个分数都会有一个排名。接下来会有m个查询,每个查询输入一个考生的ID,输出该考生4个排名中最高的那个排名及对应是A、C、M、E中的哪一个。如果对不同课程有相同排名的情况,则按优先级 A>C>M>E 输出;如果查询的考生ID不存在,则输出N/A.
补充
1.grade用数组存,就方便后面排序。
2.由于ID是六位的整数,所以设置一个Rank[10000000][4]数组,其中Rank[id][0] ~Rank[id][4]n为4门课对应的排名
3.round() 函数返回一个数字四舍五入后最接近的整数。头文件为math.h
代码
#include<iostream>
#include<math.h>
#include<algorithm>
using namespace std;
struct Student{
int id;//存放6位整数的ID;
int grade[4];//存放4个分数
}stu[2010];
char course[4] = {'A','C','M','E'};//按优先级顺序,方便输出
int Rank[10000000][4] = {0}; // Rank[id][0] ~Rank[id][4]n为4门课对应的排名
int now; //cmp函数中使用,表示当前按now 号分数排序stu数组
bool cmp(Student a,Student b){ //数组按now号分数递减排序
return a.grade[now] > b.grade[now];
}
int main()
{
int m,n;
scanf("%d%d",&n,&m);
//读入分数,其中grade[0]~grade[3]分别代表A、C、M、E
for(int i=0;i<n;i++)
{
scanf("%d%d%d%d",&stu[i].id,&stu[i].grade[1],&stu[i].grade[2],&stu[i].grade[3]);
stu[i].grade[0] = round ((stu[i].grade[1] + stu[i].grade[2] + stu[i].grade[3]) / 3.0) +0.5;
//cout<<stu[i].grade[0]<<endl;
}
for(now = 0; now < 4; now++) //枚举A、C、M、E 4个中的一个
{
sort(stu,stu + n,cmp); //对所有考生按该分数从大到小排序
Rank[stu[0].id][now] = 1; //排序完,将最高分数的设为rank1
for(int i=1;i<n;i++) //对于剩下的同学
{
//cout<<stu[i].grade[0]<<endl;
if(stu[i].grade[now] == stu[i-1].grade[now]){ //若成绩与前一个的相同
Rank[stu[i].id][now] = Rank[stu[i-1].id][now];//那么排名也相同
}else{
Rank[stu[i].id][now] = i + 1; //否则,为其设置正确的排名
}
}
}
int query; //查询的考生ID
for(int i=0;i<m;i++)
{
scanf("%d",&query);
if(Rank[query][0] == 0){
printf("N/A\n");
}else{
int k=0;
for(int j=0;j<4;j++)
{
if(Rank[query][j] < Rank[query][k]){
k = j;
}
}
printf("%d %c\n",Rank[query][k],course[k]);
}
}
return 0;
} 在这里插入代码片