C++关键字排序——[D]OSU(玩家记录排名——结构体排序)

题目描述

在音乐游戏OSU中,玩家的排名方式如下:
  如果A玩家的得分比B玩家高,则A排名在B之前;
  如果得分相等,则比较两个玩家的精度,精度高者在前;
  如果精度也相等,则比较两个玩家的COMBO数,COMBO数高者在前。
  现在给出一系列玩家的名单和表现情况,将他们按排名从高到低的顺序输出。

输入

第一行一个数N(N≤500),代表玩家的数量。
  以下N行,分别包含一个玩家的ID,分数,精度和COMBO数,用空格隔开。
  保证不会有三项数据都相同的玩家。

输出

 N行,每行一个玩家的ID,按排名从高到低输出。

样例

输入

4
  Cookiezi 1000000 70 2012
  ShaggoN 233333 95 4000
  Apricot 200000 99 1050
  Rucker 233333 100 3012

输出

Cookiezi
  Rucker
  ShaggoN
  Apricot

参考代码:

本题采用结构体方式存储,还采用了sort函数对结构体数组进行排序。

sort() 函数中,第一个参数 + 的是多少就是起始排序的下标;第二个参数 + 的是多少就是终止排序的下标 -1 。sort() 默认会进行升序排序,要使用降序排序,则应该使用:

// 自己定义比较规则
bool cmp(int a, int b)
{
    return a > b; // 降序
    // return a < b; 升序
}
sort(a, a+5, cmp);

 题目中提到了,排序先比较分数,同分再比较精度,同精度再比较combo,把这个排序规则写入cmp中,主函数直接调用sort函数就方便很多了。

#include <bits/stdc++.h>
using namespace std;

struct Player{	//定义一个玩家结构体,存储玩家id 分数 精度 combo 
	char id[10];
	int sore;
	int deep;
	int combo;
};
bool cmp(Player a, Player b)
{
	if (a.sore != b.sore)
	{
		return a.sore > b.sore;
	}
	else if (a.deep != b.deep)
	{
		return a.deep > b.deep;
	}
	else
	{
		return a.combo < b.combo;
	}
}
int main()
{
	int n;
	cin>>n;
	Player p[n];			//结构体数组 
	for(int i=0;i<n;i++){
		cin>>p[i].id>>p[i].sore>>p[i].deep>>p[i].combo;
	}
	sort(p+1,p+n+1,cmp);
	for(int i=0;i<n;i++)
		cout<<p[i].id<<endl;
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值