题目是很简单的,由于数据量很小,直接用O(N^2)的方法就可以了。
#include<iostream>
using namespace std;
struct info
{
string id;
int score[4];
int rank[4];
};
int n,m;
info student[2001];
void sort()
{
info tmp;
for (int i = 0; i < 4; i++){
for (int j = 1; j < n; j++)
{
tmp = student[j];
int k = j - 1;
while (k >=0 && student[j].score[i] > student[k].score[i]) --k;
for (int p = j-1; p >= k+1; --p)
student[p+1] = student[p];
student[k+1] = tmp;
}
int rank = 1;
int score;
int s = 0;
while (s < n){
score = student[s].score[i];
int tt = 0;
while (student[s].score[i] == score && s < n){
student[s].rank[i] = rank;
s++;
tt++;
}
rank += tt;
}
}
}
int main()
{
cin>>n>>m;
for (int i = 0; i < n; i++){
cin>>student[i].id>>student[i].score[1]>>student[i].score[2]>>student[i].score[3];
student[i].score[0] = (student[i].score[1] + student[i].score[2] + student[i].score[3]) / 3;
}
sort();
for (int i = 0; i < n ; i++)
cout<<student[i].id<<" "<<student[i].rank[0]<<" "<<student[i].rank[1]<<" "<<student[i].rank[2]<<endl;
for (int i = 0; i < m; i++){
string id;
cin>>id;
int j;
for (j = 0; j < n; j++)
if (id == student[j].id){
int r = n + m;
int t;
for (int k = 0; k < 4; k++)
if (student[j].rank[k] < r){
r = student[j].rank[k];
t = k;
}
switch (t){
case 0: cout<<r<<" A"<<endl;break;
case 1: cout<<r<<" C"<<endl;break;
case 2: cout<<r<<" M"<<endl;break;
case 3: cout<<r<<" E"<<endl;break;
default: cout<<t<<endl; break;
}
break;
}
if (j == n) cout<<"N/A"<<endl;
}
}