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
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;
}  

你可能感兴趣的:(算法,c++,数据结构)