排序 - PAT甲级 1025 PAT Ranking (25 分) C / C++

#include<cstdio>
#include<algorithm>
#include<cstring>

using namespace std;

struct testee {
	char regis_num[15];
	int score;
	int final_rank;
	int local_num;
	int local_rank;
}testees[30010];

bool cmp(testee a, testee b) {
	if (a.score != b.score) return a.score > b.score;
	else return strcmp(a.regis_num, b.regis_num) < 0;
}

int main() {
	int total_num = 0, N, K, input_idx = 0;
	scanf("%d", &N);
	for (int i = 0; i < N; i++) {// N是考场数
		int start_idx = input_idx, end_idx;
		scanf("%d", &K);
		total_num += K;
		for (int z = 0; z < K; z++) { // K是该考场考生数
			scanf("%s %d", &testees[input_idx].regis_num, &testees[input_idx].score);
			testees[input_idx].local_num = i + 1;
			input_idx++;
		}//输入某个区域的选手
		end_idx = input_idx;
		//立即局部排序
		sort(testees + start_idx, testees + end_idx, cmp);
		int local_rank = 0;
		for (int j = start_idx; j < end_idx; j++, local_rank++) {
			if (j == start_idx) {
				testees[j].local_rank = 1;
				continue;
			}

			if (testees[j].score != testees[j - 1].score) testees[j].local_rank = local_rank + 1;
			else testees[j].local_rank = testees[j - 1].local_rank;
		}
	}
	//整体排序
	sort(testees, testees + total_num, cmp);
	for (int j = 0; j < total_num; j++) {
		if (j == 0) {
			testees[j].final_rank = 1;
			continue;
		}
		if (testees[j].score != testees[j - 1].score) testees[j].final_rank = j + 1;
		else testees[j].final_rank = testees[j - 1].final_rank;
	}
	//输出
	printf("%d\n", total_num);
	for (int i = 0; i < total_num; i++) {
		printf("%s %d %d %d\n", testees[i].regis_num, testees[i].final_rank, testees[i].local_num, testees[i].local_rank);
	}

	return 0;

}

初次使用sort函数对结构体进行排序,还是有很多细节的地方需要注意。【排名从小到大,则分数由高到低】

1. sort函数传入的参数是地址, &a[10]

2.存储13位的考生号的时候,可以用long long, 但是遇到00000003这种情况没法处理,所以使用char[15]来存储可以保持原貌; 然后使用strcmp函数进行比较 【这也是测试点3的考察点】

3.scanf输入的时候,全局索引input_dix,局部z,不要用z输入

4.local_rank,保证每一种情况都能++,放在for里

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值