7-4 进步排行榜

假设每个学生信息包括“用户名”、“进步总数”和“解题总数”。解题进步排行榜中,按“进步总数”及“解题总数”生成排行榜。要求先输入n个学生的信息;然后按“进步总数”降序排列;若“进步总数”相同,则按“解题总数”降序排列;若“进步总数”和“解题总数”都相同,则排名相同,但输出信息时按“用户名”升序排列。

输入格式:

首先输入一个整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据先输入一个正整数n(1 < n < 50),表示学生总数。然后输入n行,每行包括一个不含空格的字符串s(不超过8位)和2个正整数d和t,分别表示用户名、进步总数和解题总数。

输出格式:

对于每组测试,输出最终排名。每行一个学生的信息,分别是排名、用户名、进步总数和解题总数。每行的各个数据之间留一个空格。注意,进步总数和解题总数都相同的学生其排名也相同。

输入样例:

2
6
usx15131 21 124
usx15101 27 191
usx15113 31 124
usx15136 18 199
usx15117 27 251
usx15118 21 124
10
usx15131 21 124
usx15101 27 191
usx15107 24 154
usx15113 31 124
usx15117 25 251
usx15118 21 124
usx15119 22 117
usx15121 43 214
usx15128 21 124
usx15136 28 199

输出样例:

1 usx15113 31 124
2 usx15117 27 251
3 usx15101 27 191
4 usx15118 21 124
4 usx15131 21 124
6 usx15136 18 199
1 usx15121 43 214
2 usx15113 31 124
3 usx15136 28 199
4 usx15101 27 191
5 usx15117 25 251
6 usx15107 24 154
7 usx15119 22 117
8 usx15118 21 124
8 usx15128 21 124
8 usx15131 21 124

#include<bits/stdc++.h>
using namespace std;
struct Student
{
    char name[100];
    int progressCnt;
    int solveCnt;
};
bool cmp(Student a, Student b)
{
    if(a.progressCnt != b.progressCnt)
    {
        return a.progressCnt > b.progressCnt;
    }
    else //“进步总数”相同
    {
        if(a.solveCnt != b.solveCnt)
        {
            return a.solveCnt > b.solveCnt;
        }
        else //若“进步总数”和“解题总数”都相同
        {
            return strcmp(a.name, b.name) < 0;
        }
    }
}
int main()
{
   int n, t;
   cin >> t;
   while(t --)
   {
       cin >> n;
       struct Student s[n];
       for(int i = 0 ; i < n ; i ++)
       {
           cin >> s[i].name >> s[i].progressCnt >> s[i].solveCnt;
       }
       sort(s, s + n, cmp);
       int i = 0, lasti =0;
       cout << i + 1 << " " << s[i].name <<" " << s[i].progressCnt << " " << s[i].solveCnt << endl;
       i ++;
       while(i < n)
       {
          if(s[i].progressCnt == s[lasti].progressCnt && s[i].solveCnt == s[lasti].solveCnt)
          {
                  cout << lasti + 1;
          }
          else
          {
                  cout << i + 1;
                  lasti = i;
          }
          cout << " " << s[i].name <<" " << s[i].progressCnt << " " << s[i].solveCnt << endl;
          i ++;
       }
   }
    
    return 0;
}  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值