目录
1,题目描述
Sample Input:
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
Sample Output:
1 C
1 M
1 E
1 A
3 A
N/A
题目大意
给出每个学生(对应ID)的C(程序设计)、M(数学)、E(英语)成绩(可以计算出A:平均分),要求给出前来查成绩的同学最好的一项,输出排名以及该项的代号。
输入
学生总数N 查询成绩的人数M
各学生的成绩
查成绩的学生ID
输出
查成绩的同学对应的最优成绩排名 该项的代号
2,思路
输入学生的分数数据,并计算平均值;
先后按照A C M E来对stu结构体数组进行排序,并获得学生ID在这四个方面的排名;
遍历stu结构体数组,为exist数组赋值,并且得到该学生最优排名项目下标;
处理后来m个查询;
关键点
- 学生ID为6位数字,可以考虑int类型,并声明足够大的数组,以ID为下标;
- 设计数据结构,存储输入数据:设计结构体,存放string ID,int score[4],int rank[4], int best;
- 对成绩排序:使用sort函数(头文件:algorithm),自定义比较方法(函数),比如 bool cmp(node a, node b) {return a.score[flag] > b.score[flag];} sort(stu, stu + n, cmp)
- 如何判断学生ID是否存在:可采用极端手法,声明规模为1000 000的整型数组exist,直接学生的ID作为数组下标进行查找,-1不存在,否则存在,且数组中存储的内容为stu中此ID的下标;
- 注意优先级:A>C>M>E;
- 若出现重复的排名时,例如, 应为1 1 3 4 5,而不是1 1 2 3 4;
3,代码
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
struct node{
int ID, best;
int score[4], rank[4];
} stu[2020];
int flag = -1; //全局变量 指明按哪种成绩排序
bool cmp1(node a, node b) {return a.score[flag] > b.score[flag];} //函数 自定义比较方式 用于排序
int exist[1000000]; //以id为下标 存放该学生在stu中的位置
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
#endif
int n, m, C, M, E, A;
int id;
char ch[4] = {'A', 'C', 'M', 'E'}; //注意优先级!A>C>M>E
cin>>n>>m;
for(int i = 0; i < n; i++){
cin>>id>>C>>M>>E;
stu[i].ID = id;
stu[i].score[1] = C;stu[i].score[2] = M;stu[i].score[3] = E;//注意优先级!
stu[i].score[0] = (C + M + E) / 3; //不需要四舍五入
}
//分别按A C M E对学生进行排序
for(flag = 0; flag < 4; flag++){
sort(stu, stu + n, cmp1); //排序
for(int i = 0; i < n; i++){ //赋值
stu[i].rank[flag] = i + 1;
if(stu[i].score[flag] == stu[i-1].score[flag]){ //分数相等则排名相同
stu[i].rank[flag] = stu[i-1].rank[flag];
}
}
}
memset(exist, -1, sizeof(exist));
//fill(exist.begin(), exist.end(), -1);
for(int i = 0; i < n; i++){
exist[stu[i].ID] = i; //将最后一次排序完成后 学生ID对应stu的位置 赋值到exist数组中
int minRank = 100;
for(int j = 0; j < 4; j++){ //计算最优排名
if(minRank > stu[i].rank[j]){
minRank = stu[i].rank[j];
stu[i].best = j;
}
}
}
for(int i = 0; i < m; i++){
cin>>id;
if(exist[id] == -1){
cout<<"N/A"<<endl;
}else{
int index = exist[id];
int best = stu[index].best;
cout<<stu[index].rank[best]<<' '<<ch[best]<<endl;
}
}
return 0;
}