[PAT] A1025 PAT Ranking

tips

1 关注排名的实现代码。

2 熟练sort的使用。

3 熟练vector的使用。

插入用xxx.push_back(i);

题目大意

有n个考场,每个考场有若干数量的考生。现在给出各个考场中考生的准考证号和分数,要求将所有考生按分数从高到低排序,并按顺序输出所有考生的准考证号、排名、考场号、考场内排名。
原题链接

思路

1 按考场读入各考生的信息,并对当前读入考场的所有考生进行排序。之后将该考场的所有考生的排名写入结构体。

这里用了vector保存考生信息

for (j = 0; j < k; j++){
	testees temp;
	scanf("%s %d", &temp.id, &temp.score);
	temp.ln = i + 1;
	test.push_back(temp);
}

排序。
排名的实现。

sort(test.begin() + total, test.end(), cmp);
int rank = 1;
est[total].lr = 1;
for (j = total + 1; j < total + k; j++) {
	if (test[j].score == test[j - 1].score)
		test[j].lr = test[j - 1].lr;
	else test[j].lr = j - total + 1;
}

2 对所有考生进行排序,并计算总排名。

3 输出。

AC代码

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<vector>
#include<algorithm>///////
#include<iostream>
using namespace std;
#define N 102
struct testees {
	char id[14];
	int score;
	int fr, ln, lr;
};
bool cmp(testees a, testees b) {
	if (a.score == b.score)return strcmp(a.id, b.id) < 0;
	else return a.score > b.score;
}
int main(){
	int n;
	scanf("%d", &n);
	int total = 0;
	int i, j;
	vector<testees> test;
	for (i = 0; i < n; i++){
		int k;
		scanf("%d", &k);
		for (j = 0; j < k; j++){
			testees temp;
			scanf("%s %d", &temp.id, &temp.score);
			temp.ln = i + 1;
			test.push_back(temp);///////
		}
		sort(test.begin() + total, test.end(), cmp);
		int rank = 1;
		test[total].lr = 1;
		for (j = total + 1; j < total + k; j++) {
			if (test[j].score == test[j - 1].score)
				test[j].lr = test[j - 1].lr;
			else test[j].lr = j - total + 1;
		}////////
		total += k;
	}
	sort(test.begin(), test.end(), cmp);
	test[0].fr = 1; 
	for (i = 1; i < total; i++){
		if (test[i].score == test[i - 1].score) {
			test[i].fr = test[i - 1].fr;
		}
		else test[i].fr = i + 1;
	}/////////
	printf("%d\n", total);
	for (i = 0; i < total; i++)
		printf("%s %d %d %d\n", test[i].id, test[i].fr, test[i].ln, test[i].lr);
	return 0;
}

posted @ 2020-05-06 17:42  \0.0/  阅读(85)  评论(0编辑  收藏  举报