【PAT-A】1012. The Best Rank 写题记录

这道题写好交上去报段错误,看了很久,数组什么的都是不越界的,非常得奇怪。

后面自己造了几百个数据每一步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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43456345/article/details/85209718