OJ解题排行榜中,按解题总数生成排行榜。假设每个学生信息仅包括学号、解题总数。要求先输入n个学生的信息,然后按解题总数降序排列,若解题总数相等,则按学号升序排列。
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试数据先输入一个正整数n(1≤n≤100),表示学生总数。然后输入n行,每行包括一个不含空格的字符串s(不超过8位)和一个正整数d,分别表示一个学生的学号和解题总数。
对于每组测试数据,输出最终排名信息,每行一个学生的信息:排名、学号、解题总数。每行数据之间留一个空格。注意,解题总数相同的学生其排名也相同。
1
4
0010 200
1000 110
0001 200
0100 225
1 0100 225
2 0001 200
2 0010 200
4 1000 110
#include <iostream>
#include <algorithm>
using namespace std;
struct BDP
{
int sit;
string num;
int sum;
};
int cmp(const struct BDP &A,const struct BDP &B)
{
if(A.sum==B.sum)return A.num<B.num;//若解题总数相同按照学号升序排列
else return A.sum>B.sum;//解题总数不同按照解体总数降序排列
}
int main()
{
BDP a[1000];
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
getchar();
for(int i = 1;i <= n;i ++ )
{
cin>>a[i].num>>a[i].sum;
}
sort(a+1,a+1+n,cmp);
for(int i = 1;i <= n;i ++ )
{
a[i].sit=i;
if(a[i].sum==a[i-1].sum)a[i].sit=a[i-1].sit;//若解题总数相同则继承上一名次
cout<<a[i].sit<<' '<<a[i].num<<' '<<a[i].sum<<endl;
}
}
}