pat甲级 A1025 PAT Ranking (25分)

本文介绍了一种解决竞赛编程中双排名问题的算法,包括总排名和考场内排名。通过使用C++结构体和排序函数,文章详细展示了如何在输入大量考生信息后,高效地计算并输出每位考生的总排名和考场排名。

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

题目链接:

https://pintia.cn/problem-sets/994805342720868352/problems/994805474338127872

 

题目分析:

排序问题。

需要得到两个排名,总排名,以及考场内排名。

考场内排名可以在输出该考场信息后得到,当所有考生信息输入后得到最后各个考生的总排名。

 

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,k;   // n考生总数,k单个考场考生数
struct node{
	string name;
	int score, fin_rank, loc_num, loc_rank;  // 得分,总排名,考场编号,考场内部排名
}pre[30005];
bool cmp(node a,node b){
		return a.score !=b.score ? a.score >b.score : a.name <b.name ;
}
int main(){
	cin>>n;
	int len=0;
	//输入数据,len记录当前考生数
	for(int i=0;i<n;i++){
		cin>>k;
		for(int j=0;j<k;j++){
			cin>>pre[len].name >>pre[len].score ;
			pre[len].loc_num =i+1;
			len++;
		}
		//对同组的进行处理,得到考场排名loc_rank
		sort(pre+len-k,pre+len,cmp);
		pre[len-k].loc_rank = 1;
		for(int j=len-k+1;j<len;j++){
			if(pre[j].score ==pre[j-1].score ) pre[j].loc_rank =pre[j-1].loc_rank ;
            else pre[j].loc_rank =j-(len-k)+1;  
		}
	}
	//最终排名
	sort(pre,pre+len,cmp);
    pre[0].fin_rank =1;
	for(int i=1;i<len;i++){
		if(pre[i].score ==pre[i-1].score ) pre[i].fin_rank =pre[i-1].fin_rank ;
		else pre[i].fin_rank =i + 1;
	}
	//输出结果
	cout<<len<<endl;
	for(int i=0;i<len;i++){
		cout<<pre[i].name <<" "<<pre[i].fin_rank <<" "<<pre[i].loc_num <<" "<<pre[i].loc_rank <<endl;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值