PAT A1025

思路:将输入全部保存在结构体中,然后对每组输入,先进行组内排序得到其local_rank,location_number很容易获得,随着读入组数的递增而递增。当数据读完后,对结构体数组进行整体排序,得到最终的final_rank并输出。

几个需要注意的点是:

1. 排序时按照成绩从高到低,成绩相同时,按照学号从小到大。因此cmp函数为:

bool cmp(Registration a,Registration b){
	if(a.grade != b.grade)	return a.grade > b.grade;
	else return strcmp(a.re_number,b.re_number)<0;
}

2. 排序时对相同分数的学生,其排名相同,代码如下:

for(int j=M;j<K+M;j++){
			if(reg[j].grade != reg[j-1].grade){
				reg[j].local_rank=j+1-M;
			}
			else{
				reg[j].local_rank = reg[j-1].local_rank;
			}
		}

这里的思路是,当排序后的结构体数组中,某元素不等于其前一个元素的成绩,那么他的排名=数组下标+1;如果某元素等于其前一个元素的成绩,那么他的排名=其前一个元素的排名。

提交之后有一个测试点没通过,与题解对比之后发现是因为赋值中的错误,2中进行排名计算时,需要将第一个元素单独提出来,将其排名设置为1,进入循环后为之后的元素与前项进行比较,因此这里应该为int j=M+1才合适。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值