To evaluate the performance of our first year CS majored students, we consider their grades of three courses only: For example, The grades of Then the best ranks for all the students are No.1 since the 1st one has done the best in C Programming Language, while the 2nd one in Mathematics, the 3rd one in English, and the last one in average. Input Specification:Each input file contains one test case. Each case starts with a line containing 2 numbers N and M (≤2000), which are the total number of students, and the number of students who would check their ranks, respectively. Then N lines follow, each contains a student ID which is a string of 6 digits, followed by the three integer grades (in the range of [0, 100]) of that student in the order of Output Specification:For each of the M students, print in one line the best rank for him/her, and the symbol of the corresponding rank, separated by a space. The priorities of the ranking methods are ordered as If a student is not on the grading list, simply output |
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
题目大意
给你N个学生成绩的信息,求每个学生在所有学生当中,最好的排名是哪门成绩(或者平均成绩最好),如果排名有相同的情况,要按照指定的要求输出
思路
笨办法,对四种排名排序四次,并用map记录
C/C++
#include<bits/stdc++.h>
using namespace std;
struct Student{
int id,c,m,e,avg;
}s;
void OP(int n, map<int,int>& p);
void print(int id);
map<int,int> apr,C,M,E,A;
vector<Student> box;
int main()
{
int N,K;
cin >> N >> K;
for(int z=0;z<N;z++){
cin >> s.id >> s.c >> s.m >> s.e;
apr[s.id] = 1;
s.avg = (s.c + s.m + s.e)/3;
box.push_back(s);
}
OP(1,C);
OP(2,M);
OP(3,E);
OP(4,A);
while (K--){
cin >> N;
if(apr[N]) print(N);
else puts("N/A");
}
return 0;
}
void print(int id){
char ch = 'A';
int result = A[id];
if(C[id]<result) result=C[id], ch='C';
if(M[id]<result) result=M[id], ch='M';
if(E[id]<result) result=E[id], ch='E';
printf("%d %c\n",result,ch);
}
bool cmp1(Student x,Student y){ return x.c > y.c; }
bool cmp2(Student x,Student y){ return x.m > y.m; }
bool cmp3(Student x,Student y){ return x.e > y.e; }
bool cmp4(Student x,Student y){ return x.avg > y.avg; }
void OP(int n, map<int,int>& p){
int score;
switch (n) {
case 1: sort(box.begin(),box.end(),cmp1);
score=box.front().c;
for(int z=0;z<box.size();){
int op = 0;
while (z+op<box.size() && box[z+op].c==score){
p[box[z+op].id] = z+1;
op++;
}
z += op ? op : 1;
if(z<box.size()) score = box[z].c;
}
break;
case 2:sort(box.begin(),box.end(),cmp2);
score=box.front().m;
for(int z=0;z<box.size();){
int op = 0;
while (z+op<box.size() && box[z+op].m==score){
p[box[z+op].id] = z+1;
op++;
}
z += op ? op : 1;
if(z<box.size()) score = box[z].m;
}
break;
case 3: sort(box.begin(),box.end(),cmp3);
score=box.front().e;
for(int z=0;z<box.size();){
int op = 0;
while (z+op<box.size() && box[z+op].e==score){
p[box[z+op].id] = z+1;
op++;
}
z += op ? op : 1;
if(z<box.size()) score = box[z].e;
}
break;
case 4: sort(box.begin(),box.end(),cmp4);
score=box.front().avg;
for(int z=0;z<box.size();){
int op = 0;
while (z+op<box.size() && box[z+op].avg==score){
p[box[z+op].id] = z+1;
op++;
}
z += op ? op : 1;
if(z<box.size()) score = box[z].avg;
}
break;
}
}