简述思路:
- 使用map映射来判断id是否有效,并存储相应id结构体的 下标+1。
- 使用四个数组分别来记录相应考试分数的人数,利用for循环记录前面的人数。
- 找出排名最小的科目,输出排名和科目。
#include <iostream>
#include <string>
#include <cmath>
#include <map>
using namespace std;
const int maxn = 2010;
struct info
{
int C, M, E, A;
}stu[maxn];
int c[110] = { 0 }, m[110] = { 0 }, e[110] = { 0 }, a[110] = { 0 };
char dir[4] = { 'A','C','M','E' };
void func(int index) {
int r[4] = {0}, score;
score = stu[index].A;
for (int i = 100; i > score; i--)
r[0] += a[i];
score = stu[index].C;
for (int i = 100; i > score; i--)
r[1] += c[i];
score = stu[index].M;
for (int i = 100; i > score; i--)
r[2] += m[i];
score = stu[index].E;
for (int i = 100; i > score; i--)
r[3] += e[i];
int k = 0, min = 9999;
for (int i = 0; i < 4; i++) {
if (r[i] < min) {
k = i;
min = r[i];
}
}
printf("%d %c\n", r[k]+1, dir[k]);
}
int main() {
map<string, int> table;
int n1, n2;
string id;
cin>>n1>>n2;
for (int i = 0; i < n1; i++) {
cin >> id >> stu[i].C >> stu[i].M >> stu[i].E;
stu[i].A=round((stu[i].C+ stu[i].M+ stu[i].E)/3.0); //四舍五入
c[stu[i].C]++, m[stu[i].M]++, e[stu[i].E]++,a[stu[i].A]++; //统计分数为下标的人数
table[id] = i+1; //存储序列号+1(是为了区别0这个序号所以要+1)
}
for (int i = 0; i < n2; i++) {
cin >> id;
if (table[id] > 0) {
func(table[id] - 1);//计算并输出排名
}
else
printf("N/A\n");
}
return 0;
}