题意:
为了评估CS专业一年级学生的表现,我们仅考虑他们的三门课程成绩:C-C编程语言,M-数学(微积分或线性代数)和E-英语。同时,我们通过强调学生的最佳成绩来鼓励学生-也就是说,就三门课程和平均成绩而言,在四个成绩中,我们为每个学生打印最佳成绩。
例如,C,M,E和A的成绩-四个学生的平均成绩如下:
StudentID C M E A
310101 98 85 88 90
310102 70 95 88 84
310103 82 87 94 88
310104 91 91 91 91
那么,所有学生的最佳成绩是第一名,因为第一名的学生在C编程语言方面的表现最好,而第二名的数学水平最高,第三名的英语水平最高,平均最后一位。
输入规格:
每个输入文件包含一个测试用例。每种情况都从包含2个数字N和M(≤2000)的行开始,这两个数字分别是学生总数和要检查其排名的学生人数。然后,N行跟随,每行包含一个由6位数字组成的字符串的学生ID,然后按C,M和E的顺序跟随该学生的三个整数等级(在[0,100]范围内)。是M行,每行包含一个学生ID。
输出规格:
对于M个学生中的每一个,在一行中打印出最适合他/她的等级,以及相应等级的符号,并用空格隔开。
排名方法的优先级顺序为A> C> M>E。因此,如果有两种或多种方法让学生获得相同的最佳排名,请输出优先级最高的一种。
如果学生不在评分列表中,只需输出N / A。
输入样例:
5 6
310101 98 85 88
310102 70 95 88
310103 82 87 94
310104 91 91 91
310105 85 90 90
310101
310102
310103
310104
310105
999999
样本输出:
1 C
1 M
1 E
1 A
3 A
N/A
思路:
这代码是从算法笔记这本书上学来的
排名优先级:A > C > M > E
排名会有相同的,要处理(一开始自己写代码,打算刚开始结构体的score数组用来存分数,后面经过排名后再用来存储排名,十分不方便,比如id在结构体里面,还有排名会有相同,改完排名后上一个用来作比较的就不在了,总之很麻烦)
所以还是单独用一个数组来记录排名好,虽然很浪费空间,但是很方便,还有这个cmp我当时分开写了四个,现在这个循环下标就很好。。。
代码:
#include <iostream>
#include <algorithm>
#include <vector>
#include <cstdio>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <queue>
#include <set>
#include <map>
using namespace std; //(从算法笔记上学来的,比自己写的少了很多坑)
struct node{
int id;
int score[4]; //分数 A C M E
}stu[2050];
int now; //cmp的排序方法(按哪种分数排序)
bool cmp(node a,node b)
{
return a.score[now]>b.score[now]; //分数大到小
}
char course[4]={'A','C','M','E'}; //课程 (按优先级)
int pai[10000000][4]={0}; //每个学生的四种排名 ,pai[学号][课程类型] = 排名
int n,m;
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
{
cin>>stu[i].id>>stu[i].score[1]>>stu[i].score[2]>>stu[i].score[3];
stu[i].score[0]=(stu[i].score[1]+stu[i].score[2]+stu[i].score[3])/3; //平均分
}
for(now=0;now<=3;now++)
{
sort(stu,stu+n,cmp);
pai[stu[0].id][now] = 1; // 该排序类型的第一名 pai[学号][课程类型] = 排名
for(int i=1;i<n;i++)
{
if(stu[i].score[now] == stu[i-1].score[now])
pai[stu[i].id][now] = pai[stu[i-1].id][now];
else
pai[stu[i].id][now]=i+1;
}
}
int cha;
while(m--)
{
cin>>cha;
if(pai[cha][0]==0) //没排名,id不存在
cout<<"N/A"<<endl;
else
{
int j=0; //假设最好排名是第一门课程
for(int i=1;i<4;i++) //与后面三门对比
{
if(pai[cha][i]<pai[cha][j])
j=i;
}
cout<<pai[cha][j]<<" "<<course[j]<<endl; //找到排名最高的(数字最小)
}
}
return 0;
}