首页 > 其他分享 >DSOJ 题解 #202103. 【21网络赛C】来帮我们排排名

DSOJ 题解 #202103. 【21网络赛C】来帮我们排排名

时间:2022-11-18 20:02:06浏览次数:58  
标签:21 players int 题解 player STU DSOJ total id

【21网络赛C】来帮我们排排名 - 题目 - DSOJ

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct player_data {
    char id[11];
    int problem_time[5];
    int pass[5];
    int pass_num;
    int final_time;
} players[500];
typedef struct player_data STU;

int find_player_number(char player_id[11], int total_players);
int cmp(const void* p1, const void* p2) {
    if (((STU*)p2)->pass_num == ((STU*)p1)->pass_num) {
        if (((STU*)p1)->final_time == ((STU*)p2)->final_time)
            return strcmp(((STU*)p1)->id, ((STU*)p2)->id);
        return ((STU*)p1)->final_time - ((STU*)p2)->final_time;
    }
    return ((STU*)p2)->pass_num - ((STU*)p1)->pass_num;
}

int main() {
    int total_players = 0;
    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        int ptr_player;
        char player_id[11];
        char problem;
        int t;
        char state[9];
        scanf("%s %c %d %s", player_id, &problem, &t, state);
        problem = problem - 'A';                                   //确定是第几题
        ptr_player = find_player_number(player_id, total_players); //找到人名对应的位置
        if (players[ptr_player].pass[problem] == 1)                   //已经做对了就赶紧滚蛋
            continue;
        if (ptr_player == total_players) //如果是新人
        {
            strcpy(players[total_players].id, player_id); //更新名字
            total_players++;                              //总人数加一
        }
        if (state[0] == 'R') //如果没做对
        {
            players[ptr_player].problem_time[problem] += 20;
        }
        else //如果做对了
        {
            players[ptr_player].pass[problem] = 1;
            players[ptr_player].pass_num++;                                                     //打上标记
            players[ptr_player].final_time += t + players[ptr_player].problem_time[problem]; //算上时间
        }
    }
    qsort(players, total_players, sizeof(players[0]), cmp);
    for (int i = 0; i < total_players; i++)
        printf("%s %d %d\n", players[i].id, players[i].pass_num, players[i].final_time);
    system("pause");
    return 0;
}

int find_player_number(char player_id[11], int total_players) {
    for (int i = 0; i < total_players; i++)
        if (strcmp(player_id, players[i].id) == 0)
            return i;
    return total_players;
}

标签:21,players,int,题解,player,STU,DSOJ,total,id
From: https://www.cnblogs.com/fjnhyzCYL/p/16904757.html

相关文章