1012 The Best Rank (25 分)
题目大意:
给了一个人学号 和三个学科的分数
要求输出这个人 在这一群人中排名最高的学科的名次和科目
如果这个人有两科排名相同 假如在这一群人中 他这两科都是第一 那么就按照ACME的优先级 输出科目名称
分析:
先用结构体存储每个人的信息
然后四次排序…
排序写到自闭
每一次要得到一种科目的排名并存储到结构体里面
然后在最后 利用vis数组 间接存储 ID
这题写的心态爆炸 代码冗余太严重了 中间4个排序可以用循环的但是懒得改了
AC代码:
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
struct NodE{
int id;
int subject[4];
int Rank[4];
}Node[2005];
int vis[1000000];
string ch="ACME";
int N,M,id,a,b,c,s;
struct Rule1{
bool operator()(const NodE& a,const NodE& b){
return a.subject[0]>b.subject[0];
}
};
struct Rule2{
bool operator()(const NodE& a,const NodE& b){
return a.subject[1]>b.subject[1];
}
};
struct Rule3{
bool operator()(const NodE& a,const NodE& b){
return a.subject[2]>b.subject[2];
}
};
struct Rule4{
bool operator()(const NodE& a,const NodE& b){
return a.subject[3]>b.subject[3];
}
};
int main(){
memset(vis,0,sizeof(vis));
cin>>N>>M;
for(int i=0;i<N;i++){
cin>>id>>a>>b>>c;
s=a+b+c;
Node[i].id=id;
Node[i].subject[0]=s;
Node[i].subject[1]=a;
Node[i].subject[2]=b;
Node[i].subject[3]=c;
Node[i].Rank[0]=1;
Node[i].Rank[1]=1;
Node[i].Rank[2]=1;
Node[i].Rank[3]=1;
}
sort(Node,Node+N,Rule1());
for(int i=1;i<N;i++){
if(Node[i].subject[0]==Node[i-1].subject[0])
Node[i].Rank[0]=Node[i-1].Rank[0];
else
Node[i].Rank[0]=i+1;
}
sort(Node,Node+N,Rule2());
for(int i=1;i<N;i++){
if(Node[i].subject[1]==Node[i-1].subject[1])
Node[i].Rank[1]=Node[i-1].Rank[1];
else
Node[i].Rank[1]=i+1;
}
sort(Node,Node+N,Rule3());
for(int i=1;i<N;i++){
if(Node[i].subject[2]==Node[i-1].subject[2])
Node[i].Rank[2]=Node[i-1].Rank[2];
else
Node[i].Rank[2]=i+1;
}
sort(Node,Node+N,Rule4());
for(int i=1;i<N;i++){
if(Node[i].subject[3]==Node[i-1].subject[3])
Node[i].Rank[3]=Node[i-1].Rank[3];
else
Node[i].Rank[3]=i+1;
}
for(int i=0;i<N;i++)
vis[Node[i].id]=i+1;
int no;
for(int j=0;j<M;j++){
cin>>no;
if(vis[no]==0)
cout<<"N/A"<<endl;
else{
int i=vis[no]-1;
int Min=999999999,tmp;
for(int j=0;j<4;j++){
if(Node[i].Rank[j]<Min){
Min=Node[i].Rank[j];
tmp=j;
}
}
cout<<Min<<" "<<ch[tmp]<<endl;
}
}
return 0;
}