1025 PAT Ranking

1025 PAT Ranking

题目大意

按成绩排名,不过多了几层,要分别按当地和最终排名,分别排一下。

算法思想

  • 用vector进行sort函数的排序,可以大大减小工作量,只需重构cmp函数即可
  • 排名的时候,相同分数排名相等,这个需要注意一下
  • 没啥特殊点,不过最后一个测试点好像数据很大,需要注意些节省时间和空间,虽然我没出错。

代码

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct student
{
	string id;
	int score, f_rank, l_id, l_rank;
};
bool cmp(student a, student b)//重构比较函数
{
	if (a.score != b.score)
		return a.score > b.score;//分数大在前
	else
		return a.id < b.id;//分数相等,id小在前
}
int main()
{
	vector<student>pat;
	int n, k;
	cin >> n;
	for (int i = 1; i <= n; i++)
	{
		cin >> k;
		vector<student>s(k);
		for (int j = 0; j < k; j++)
		{
			cin >> s[j].id >> s[j].score;
			s[j].l_id = i;
		}
		sort(s.begin(), s.end(), cmp);//排序,方便排名
		s[0].l_rank = 1;
		for (int j = 1; j < k; j++)//实现当地排名
		{
			if (s[j].score != s[j - 1].score)//不与上一位相等
				s[j].l_rank = j + 1;
			else
				s[j].l_rank = s[j - 1].l_rank;
		}
		pat.insert(pat.end(), s.begin(), s.end());
	}
	sort(pat.begin(), pat.end(), cmp);//排序
	pat[0].f_rank = 1;
	for (int i = 1; i < pat.size(); i++)//实现最终排名进制
	{
		if (pat[i].score != pat[i - 1].score)
			pat[i].f_rank = i + 1;
		else
			pat[i].f_rank = pat[i - 1].f_rank;
	}
	cout << pat.size() << endl;
	for (int i = 0; i < pat.size(); i++)
		cout << pat[i].id <<" " << pat[i].f_rank <<" " << pat[i].l_id <<" "<< pat[i].l_rank << endl;
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值