7-41 PAT排名汇总 (25 分)多样排序

原题:https://pintia.cn/problem-sets/15/problems/888

思路:

创建一个结构体,里面包含每个考生的各种信息:姓名,成绩,分区排名,最终排名,地区

struct stu {
	string name;
	int score,place,Sum_rank,zone_rank;
}List[MAXSIZE];

排序分成三步:

第一步,对分区学生按照成绩高低进行排名,同时将排名记录进该考试信息中;

第二步,对所有考生按照成绩高低进行排名,同时将排名记录进该考试信息中;

第三步,对所有考生按照总地区的排名进行排序,如果出现并列的则按小学号排序;

完成第三步之后直接按顺序输出即可;

#include<iostream>
#include<algorithm>
#include<string>
#define MAXSIZE 30010
using namespace std;
struct stu {
	string name;
	int score,place,Sum_rank,zone_rank;
}List[MAXSIZE];
bool cmp(stu a, stu b) { return a.score > b.score; }
bool cmp1(stu a, stu b)
{
	return a.Sum_rank != b.Sum_rank ? a.Sum_rank < b.Sum_rank : a.name < b.name;
}
int main()
{
	int n, cnt = 0;
	scanf("%d", &n);
	for (int i = 1; i <= n; i++)
	{
		int k;
		struct stu stus[300];
		scanf("%d", &k);
		for (int j = 0; j < k; j++)
		{
			cin >> stus[j].name>>stus[j].score;
			stus[j].place = i;			
		}
		sort(stus, stus + k, cmp);
		//开始处理分区排名,并且处理并列的那些排名
		for (int j = 0; j < k; j++)
		{
			int p = j;
			if (stus[j - 1].score == stus[j].score && j >= 1) {
				
				while (stus[p - 1].score == stus[p].score && p >= 1)p--;
			}
			stus[j].zone_rank = p + 1;
			List[cnt++] = stus[j];//存储到总表之中
		}
	}
	sort(List, List + cnt,cmp);//对总表进行排名,并且处理并列的排名
	for (int j = 0; j < cnt; j++)
	{
		int p = j;
		if (List[j - 1].score == List[j].score && j >= 1) {

			while (List[p - 1].score == List[p].score && p >= 1)p--;
		}
		List[j].Sum_rank = p+1;
	}
	sort(List, List + cnt, cmp1);
	cout << cnt << endl;
	for (int i = 0; i < cnt; i++)
	{
		cout << List[i].name << " " << List[i].Sum_rank << " " << List[i].place << " " << List[i].zone_rank << endl;
	}
	return 0;
}
	

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值