pat-1080(排序)

本文深入解析PAT-1080竞赛题目中的排序算法实现,包括成绩排序逻辑、选手排名确定及选择过程。通过C++代码详细展示了如何按照总分和英语成绩进行降序排序,并在相同分数下比较英语成绩。同时介绍了如何使用额外数组记录排序后的序号,以及如何根据排序前的序号进行二次排序。

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

pat-1080(排序)

思路:

(1)按照成绩从大到小排序,tol相同再比较,EG。

(2)vc[i]数组记录每个数字排序后的序号,然后对vc[i]这个数组进行排序(按照排序前的序号大小)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 100100;
struct Node{
	int EG,IG,tol,id,rk;
	int choi[10];
}cur[maxn];
bool cmp(Node a,Node b)
{
	if(a.tol!=b.tol) return a.tol>b.tol;
	else return a.EG>b.EG;
}
bool ccp(int x,int y)
{
	if(cur[x].id!=cur[y].id) return cur[x].id<cur[y].id;
}
int sch[20];
vector <int> vc[maxn];
int main(void)
{
	int n,m,k,i,j,x,y;
	scanf("%d%d%d",&n,&m,&k);
	for(i=0;i<m;i++) scanf("%d",&sch[i]);
	for(i=0;i<n;i++){
		scanf("%d%d",&cur[i].EG,&cur[i].IG);
		cur[i].tol=cur[i].EG+cur[i].IG;
		cur[i].id=i;
		for(j=1;j<=k;j++) scanf("%d",&cur[i].choi[j]);
	}
	sort(cur,cur+n,cmp);
	for(i=0;i<n;i++){
		if(i!=0&&cur[i].tol==cur[i-1].tol&&cur[i].EG==cur[i-1].EG) cur[i].rk=cur[i-1].rk;
		else cur[i].rk=i+1;
		for(j=1;j<=k;j++){
			x=cur[i].choi[j];
			if(vc[x].size()<sch[x]){
				vc[x].push_back(i);break;
			}
			else{
				y=vc[x][vc[x].size()-1];
				if(cur[i].rk==cur[y].rk){
					vc[x].push_back(i);break;
				}
			}
		}
	}
	for(i=0;i<m;i++){
		if(vc[i].size()>0){
			sort(vc[i].begin(),vc[i].end(),ccp);
			for(j=0;j<vc[i].size();j++){
				if(j) printf(" ");
				printf("%d",cur[vc[i][j]].id);
			}
		}
		printf("\n");
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值