题目描述
在音乐游戏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;
}