PAT 甲级 1025 PAT Ranking (25 分)

本文介绍了一种用于处理多个考场学生考试成绩的排序与排名算法。算法首先按分数从高到低对每个考场的成绩进行排序,分数相同时,ID较小的学生排名在前。之后,对所有考场的成绩进行总排序,再次确保分数相同时,ID较小的学生排名在前。通过这种方式,实现了对考试成绩的公平、准确排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

25分题

排序原则:不论是各个考场排序还是总排序,都是按分数从高到低排,若分数相同,则排名相同,输出时id小的在前(该排序原则在sort第三个参数cmp中体现)

分组排序后再总排序

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct stu
{
	string id;
	int local;
	int grade;
	int local_rank;
	int total_rank;
}v[30005];

bool cmp(stu a,stu b)                       //sort第三个参数,分数相同则id小排在前 
{
	if(a.grade!=b.grade)return a.grade>b.grade;
	else return a.id<b.id;
}

int main()
{
	int num_local,num_stu=0,i,j,k,x;
	cin>>num_local;
	for(i=0;i<num_local;i++)
	{
		cin>>x;                                           //该考场人数 
		for(j=0;j<x;j++)
		{
			v[num_stu].local=i+1;                         //考场号 
			cin>>v[num_stu].id>>v[num_stu].grade;
			num_stu++;
		}
		sort(v+num_stu-x,v+num_stu,cmp);                      //考场排序 
		v[num_stu-x].local_rank=1;
		for(j=num_stu-x+1;j<num_stu;j++)                      //j从该考场第二名学生的下标开始 
		{
			if(v[j].grade==v[j-1].grade)v[j].local_rank=v[j-1].local_rank;   //如果和前一名同学分数一样,那么排名也一样 
			else v[j].local_rank=j+1-(num_stu-x);
		}
	}
	cout<<num_stu<<endl;
	sort(v,v+num_stu,cmp);                    //总排序 
	v[0].total_rank=1;
	cout<<v[0].id<<" "<<v[0].total_rank<<" "<<v[0].local<<" "<<v[0].local_rank<<endl;
	for(i=1;i<num_stu;i++)
	{
		if(v[i].grade==v[i-1].grade)v[i].total_rank=v[i-1].total_rank;
		else v[i].total_rank=i+1;
		cout<<v[i].id<<" "<<v[i].total_rank<<" "<<v[i].local<<" "<<v[i].local_rank;
		if(i!=num_stu-1)cout<<endl;
	}
	return 0;
 } 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值