#include <iostream> //参考了人家的解法
#include <vector>
#include <algorithm>
#include <map>
using namespace std;
struct Stu{
int id;
int C;
int M;
int E;
int A;
};
bool sortByC(Stu a,Stu b)
{ return a.C>b.C;}
bool sortByM(Stu a,Stu b)
{ return a.M>b.M;}
bool sortByE(Stu a,Stu b)
{ return a.E>b.E;}
bool sortByA(Stu a,Stu b)
{return a.A>b.A;}
int main()
{
freopen("PAT1012.txt","r",stdin);
int N,M,Q;
vector<Stu> v;
map<int,char> myType;
map<int,int> myRank;
cin>>N>>M;
Stu S;
for(int i=0;i<N;++i) //读入所有学生资料
{
cin>>S.id>>S.C>>S.M>>S.E;
S.A=(S.C+S.M+S.E)/3;
v.push_back(S);
}
int score=-1;
int rank=0;
sort(v.begin(),v.end(),sortByA);
for(int i=0;i<v.size();++i) //先考察学生A成绩的排名
{
if(v[i].A!=score)
{
rank=i+1; //更新排名
}
score=v[i].A;
myRank[v[i].id]=rank; //给每个学生按A成绩排名
myType[v[i].id]='A'; //说明排名类型是A
}
score=-1;
rank=0;
sort(v.begin(),v.end(),sortByC);
for(int i=0;i<v.size();++i) //然后考察学生C成绩的排名
{
if(v[i].C!=score)
{
rank=i+1; //更新排名
}
score=v[i].C;
if(rank<myRank[v[i].id]) //如果当前排名方式较前一种排名方式考前,那么更新排名
{
myRank[v[i].id]=rank; //给每个学生按新的方式排名
myType[v[i].id]='C'; //说明排名类型
}
}
score=-1;
rank=0;
sort(v.begin(),v.end(),sortByM);
for(int i=0;i<v.size();++i) //然后考察学生M成绩的排名
{
if(v[i].M!=score)
{
rank=i+1; //更新排名
}
score=v[i].M;
if(rank<myRank[v[i].id]) //如果当前排名方式较前一种排名方式考前,那么更新排名
{
myRank[v[i].id]=rank; //给每个学生按新的方式排名
myType[v[i].id]='M'; //说明排名类型
}
}
score=-1;
rank=0;
sort(v.begin(),v.end(),sortByE);
for(int i=0;i<v.size();++i) //然后考察学生E成绩的排名
{
if(v[i].E!=score)
{
rank=i+1; //更新排名
}
score=v[i].E;
if(rank<myRank[v[i].id]) //如果当前排名方式较前一种排名方式考前,那么更新排名
{
myRank[v[i].id]=rank; //给每个学生按新的方式排名
myType[v[i].id]='E'; //说明排名类型
}
}
for(int i=0;i<M;++i) //检测每个学号的输入是否存在,存在就输出结果
{
cin>>Q;
if(myRank.count(Q))
{
cout<<myRank[Q]<<' '<<myType[Q]<<endl;
}
else
cout<<"N/A"<<endl;
}
return 0;
}
浙大PAT (Advanced Level) Practise 1012 The Best Rank (25)
最新推荐文章于 2017-03-03 21:48:59 发布