这道题写好交上去报段错误,看了很久,数组什么的都是不越界的,非常得奇怪。
后面自己造了几百个数据每一步print出来,发现用sort排序完以后,有丢数据的现象。上网查了一下查到了以下一句话
cmp必须写<或>,不能写成<=或>=。否则,可能出现段错误!!!
bug整整找了2天,心态崩了。
这道题的关键是根据A,C,M,E的优先顺序分别排序,然后输出名次最高的,因此range也按照这个顺序,便于后续输出。这里我的range放在结构体中,查找的时候要遍历,可以像算法笔记中,直接rank[ID][t],可以用ID直接定位,省去了遍历查找的一步。
#include <cstdio>
#include <cstring>
#include <algorithm>
const char ran[4]={'A','C','M','E'};
using namespace std;
struct Student{
int ID;
int grade[5];
int range[5];
}stu[2010];
int now=0;
bool cmp(Student a,Student b){
return a.grade[now]>b.grade[now];
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++){
scanf("%d%d%d%d",&stu[i].ID,&stu[i].grade[1],&stu[i].grade[2],&stu[i].grade[3]);
stu[i].grade[0] = (stu[i].grade[1]+stu[i].grade[2]+stu[i].grade[3])/3;
} //输入,这里grade[3]算法题目有点模糊
for (now=0;now<4;now++){
sort(stu,stu+n,cmp);
stu[0].range[now] = 1;
for (int i=1;i<n;i++){
if (stu[i].grade[now]==stu[i-1].grade[now]) stu[i].range[now] = stu[i-1].range[now]; //如果分数一样,名次一样
else stu[i].range[now] = i+1;
}
}
for (int i=0;i<m;i++){
int ID;
scanf("%d",&ID);
bool flag = true;
for (int j=0;j<n;j++){
if (ID==stu[j].ID) { //遍历一下,若是找到则输出
int min = 0;
for (int t=1;t<4;t++){
if (stu[j].range[t]<stu[j].range[min]) min = t;
}
printf("%d %c\n",stu[j].range[min],ran[min]);
flag = false;
break;
}
}
if (flag) printf("N/A\n");
}
return 0;
}