题目大意:现已知n个考生的3门分数,平均分可以按照这三门算出来。然后分别对这四个分数从高到低排序,这样对每个考生来说有4个排名。k个查询,对于每一个学生id,输出当前id学生的最好的排名和它对应的分数,如果名次相同,按照A>C>M>E的顺序输出。如果当前id不存在,输出N/A
思路:
- 先定义个结构体,里面包含了一个分数的数组和对应排名的数组。
- 输入后进行排序,排序后存到对应排名的数组中。
- 查询的时候还要对查询的人调选排名最高的名词和分数输出,用比较就行了。
- 注意排名相等的时候优先输出顺序。
—————————————————————————
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
struct student
{
int id;
int grade[4];
}stu[2010];
int Rank[100000000][4] = { 0 };
char course[4] = {'A','C','M','E'};
int now = -1;
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);
Rank[stu[0].id][now] = 1;
for (int j = 1; j < n; j++) //所有同学间比较
{
if (stu[j].grade[now] == stu[j-1].grade[now])
Rank[stu[j].id][now] = Rank[stu[j - 1].id][now];
else
Rank[stu[j].id][now] = j + 1;
}
}
int query; //查询考生的ID
for (int i = 0; i < m; i++)
{
cin >> query;
if (Rank[query][0] == 0)
cout << "N/A" << endl;
else
{
int k = 0;
for (int j = 0; j < 4; j++)
{
if (Rank[query][j] < Rank[query][k])
{
k = j;
}
}
cout << Rank[query][k] << " " << course[k] << endl;
}
}
}