PTA 7-315 进步排行榜

PTA 7-315 进步排行榜

分数 10
作者 黄龙军
单位 绍兴文理学院

假设每个学生信息包括“用户名”、“进步总数”和“解题总数”。解题进步排行榜中,按“进步总数”及“解题总数”生成排行榜。要求先输入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

来源:
[1] 黄龙军, 等. 大学生程序设计竞赛入门—C/C++程序设计(微课视频版), 北京:清华大学出版社, 2020.11. ISBN:9787302564744
[2] 黄龙军.程序设计竞赛入门(Python版),北京:清华大学出版社,2021.4. ISBN:9787302571230

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB

#include 
#include 

struct student
{
    char name[10];
    int d;//进步总数
    int t;//解题总数
};

int main(){
    
    int T;
    scanf("%d", &T);
    
    for(int q = 0; q < T; q++){
        int n;
        int i, j, l;
        scanf("%d", &n);
        struct student s[n];
        for(i = 0; i < n; i++){    //将每位学生的信息储存
            scanf("%s%d%d", s[i].name, &s[i].d, &s[i].t);
        }
        //排序
        for(i = 0; i < n; i++){
            for(j = 0; j < n-1; j++){
                if(s[j].d < s[j+1].d ||
                   (s[j].d == s[j+1].d && s[j].t < s[j+1].t) || 
                   (s[j].d == s[j+1].d && s[j].t == s[j+1].t && strcmp(s[j].name,s[j+1].name) > 0)
                  ){
                    //此处判断条件非常关键!分为三层,即三种需要排序的情况,注意不要使用 <= 来判断
                    struct student tp;
                    tp = s[j];
                    s[j] = s[j+1];
                    s[j+1] = tp;
                }
            }
        }
        //输出
        for(i = 0; i < n; i++){
            j = 0;
            int tp = i;
            while(s[tp].d == s[tp+1].d && s[tp].t == s[tp+1].t){
                j++;
                tp++;
            }
            if(j == 0)
                printf("%d %s %d %d\n", i+1, s[i].name, s[i].d, s[i].t);
            else{
                for(l = i; l <= i+j; l++){
                    printf("%d %s %d %d\n", tp-j+1, s[l].name, s[l].d, s[l].t);
                }
                i += j;
            }
        }
    }
    return 0;
}

解题思路:
定义结构体将每位学生信息储存,然后按题目要求排序,最后输出
注: 输出格式

归属知识点:
结构体
数组
循环结构
条件选择

你可能感兴趣的:(c语言)