PAT排名汇总

szz123 / 2024-11-07 / 原文

题目

#include<iostream>
#include<string>
#include<map>
#include<algorithm>
using namespace std;

struct stu
{
	string id;
	int place;
	int score;
	int rank;
	int zrank;
}s[30010];

//输出须按最终排名的递增顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。
//总结:分高的先输出,考号低的先输出
bool cmp(stu a, stu b)
{
	if (a.score == b.score)
	{
		return a.id < b.id;
	}
	else
	{
		return a.score > b.score;
	}
}

int main() {
	int n, k;
	int cnt=0, num=0;//下标:cnt 总学生:s
	cin >> n;
	for (int i = 0; i < n; i++)
	{
		
		cin >> k;
		num += k;
		for (int j = 0; j < k; j++)
		{
			s[cnt].place = i + 1;
			cin >> s[cnt].id >> s[cnt].score;
			cnt++;
		}
		
		sort(s + (num - k), s + num, cmp);
		int p = 1;
		for (int i = num - k; i < num; i++)
		{
			if (s[i].score == s[i - 1].score && i >= 1) s[i].rank = s[i - 1].rank;
			else s[i].rank = p;
			p++;//无论if还是else,这句都要执行
		}
	}
	//先把考场排名算出来,再重新算总排名

	sort(s, s + num, cmp);
	for (int i = 0; i < num; i++)
	{
		if (s[i].score == s[i - 1].score && i >= 1)
		{
			s[i].zrank = s[i - 1].zrank;
		}
		else
		{
			s[i].zrank = i + 1;
		}
	}
	cout << num << endl;
	for (int i = 0; i < num; i++)
	{
		cout << s[i].id << ' ' << s[i].zrank << ' ' << s[i].place<< ' ' << s[i].rank << endl;
	}
}