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

【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;
}
posted @   残影0无痕  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示