PAT_A1012
PAT甲级1012.
目录
A1012
题目
样例
输入:
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
输出:
1 C
1 M
1 E
1 A
3 A
N/A
思路和坑点
对各个成绩进行排名,并且按照怕排名更新rank。同时使用map标记是否有记录存在,由于学生结构体的数据量比较大,所以采用排下标的方式,节省时间。另外,由于成绩只有三科,所以平均分的比较直接算成总分比较,可以有效避免平均以后浮点数比较的坑。
结构体下标排序参见我的博客分类PAT中的《PAT总结》中结构体部分的说明。排序的比较函数写成一个,使用全局变量标记控制排序规则。
坑点
PAT中的所有的排名方式大多是按照一下规则,并列时同排名,不并列时,排名是实际的次序,而不是紧跟并列的排名。比如:1 1 2 3 4,有前两个并列的情况,PAT中普遍采用的方法是1 1 3 4 5.
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef struct node{ //学生结构体
int id,c,m,e,a; //成绩
int ar,cr,mr,er; //排名
}Node;
vector<Node> ST;
map<int,int> mp; //记录是否存在该记录
vector<int> sidx; //结构体数据量较大,使用下标排序,减少时间
char tag;
bool cmp(int i,int j){ //比较函数,使用全局标记控制
switch(tag){
case 'A' :return ST[i].a>ST[j].a;break;
case 'C' :return ST[i].c>ST[j].c;break;
case 'M' :return ST[i].m>ST[j].m;break;
case 'E' :return ST[i].e>ST[j].e;break;
}
}
void check(){
int id;
scanf("%d",&id); //输出结果
if(mp.find(id)==mp.end()) puts("N/A");
else{
int v=mp[id];
int rank=ST[v].er; char ch='E'; //根据优先级,由低到高进行比较,节省比较次数
if(ST[v].mr<=rank) {rank=ST[v].mr;ch='M';}
if(ST[v].cr<=rank) {rank=ST[v].cr;ch='C';}
if(ST[v].ar<=rank) {rank=ST[v].ar;ch='A';}
printf("%d %c\n",rank,ch);
}
}
int main(void){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt","r",stdin);
#endif
int n,k;
scanf("%d%d",&n,&k);
ST.resize(n); sidx.resize(n);
for(int i=0;i<n;i++){
scanf("%d%d%d%d",&ST[i].id,&ST[i].c,&ST[i].m,&ST[i].e);
mp[ST[i].id]=i; sidx[i]=i;
ST[i].a=ST[i].c+ST[i].m+ST[i].e;
}
tag='A';
sort(sidx.begin(),sidx.end(),cmp); //排序
int pre=sidx[0]; ST[pre].ar=1; //初始化第一个排名
for(int i=1;i<n;i++){
int v=sidx[i]; //后序排名由上一个决定,分数相同,排名相同
if(ST[v].a==ST[pre].a) ST[v].ar=ST[pre].ar;
else ST[v].ar=i+1; //如果不同,更新为排名
pre=v;
}
tag='C';
sort(sidx.begin(),sidx.end(),cmp);
pre=sidx[0]; ST[pre].cr=1;
for(int i=1;i<n;i++){
int v=sidx[i];
if(ST[v].c==ST[pre].c) ST[v].cr=ST[pre].cr;
else ST[v].cr=i+1;
pre=v;
}
tag='M';
sort(sidx.begin(),sidx.end(),cmp);
pre=sidx[0]; ST[pre].mr=1;
for(int i=1;i<n;i++){
int v=sidx[i];
if(ST[v].m==ST[pre].m) ST[v].mr=ST[pre].mr;
else ST[v].mr=i+1;
pre=v;
}
tag='E';
sort(sidx.begin(),sidx.end(),cmp);
pre=sidx[0]; ST[pre].er=1;
for(int i=1;i<n;i++){
int v=sidx[i];
if(ST[v].e==ST[pre].e) ST[v].er=ST[pre].er;
else ST[v].er=i+1;
pre=v;
}
for(int i=0;i<k;i++){
check();
}
return 0;
}