解题思路:
1.按照题意对每种成绩进行排序, 然后进行排名即可
2.排名时注意,成绩相同者排名相同,而成绩相同者向后第一位不同者,排名应该为前面的人数总和加一,如:99 98 98 98 97 ,第一个人为第一, 第二、三、四个人并列第二, 第五个人为第五。
C++代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 2010;
struct Student
{
int id;
int score[4]; //四个成绩分别为 A C M E
int Rank[4]; //四个排名分别为A C M E
} stu[maxn];
//打表
char table[4] = {'A', 'C', 'M', 'E'};
//比较函数,可根据不同情况比较不同的成绩
int now;
bool cmp(Student a, Student b)
{
return a.score[now] > b.score[now];
}
//排名函数,对第i个成绩进行拍名,总人数为n
void RankFunc(int i, int n)
{
int r = 1;
stu[0].Rank[i] = r;
for(int j = 1; j < n; j++)
{
if(stu[j].score[i] == stu[j-1].score[i])
stu[j].Rank[i] = r;
else
{
r = j + 1;
stu[j].Rank[i] = r;
}
}
}
int main()
{
int n, m;
while(scanf("%d%d", &n, &m) != EOF)
{
for(int i = 0; i < n; i++)
{
scanf("%d%d%d%d", &stu[i].id, &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]);
stu[i].score[0] = 0;
for(int j = 1; j < 4; j++)
stu[i].score[0] += stu[i].score[j];
}
//对四个成绩分解进行排名
for(int i = 0; i < 4; i++)
{
now = i;
sort(stu, stu + n, cmp);
RankFunc(i, n);
}
//输出
for(int i = 0; i < m; i++)
{
int id ;
scanf("%d", &id);
int flag = 0;
for(int j = 0; j < n; j++)
{
if(id == stu[j].id)
{
flag = 1;
int course = 0, minR = 10000;
//寻找最高名次
for(int k = 0; k < 4; k++)
{
if(stu[j].Rank[k] < minR)
{
course = k;
minR = stu[j].Rank[k];
}
}
printf("%d %c\n", minR, table[course]);
break;
}
}
//无效id
if(flag == 0)
printf("N/A\n");
}
}
return 0;
}