【题目描述】
小民想通过选拔赛加入学校程序设计竞赛实验班,他了解到选拔赛规则如下:每位选手具有参与度积分、积分赛积分、现场赛积分 3 项成绩,然后按一定的排序规则来排位,最后排位前 5 名的学生入选实验班。第一排序规则为总分从高到低排序;第二排序规则为如果两位选 手的总积分相同,再按现场赛积分从高到低排序;第三排序规则为如果两位选手的总积分和现场赛积分都相同,则按参赛编号从低到高排序。排序完成后,每位选手的排位都是唯一确定的。
【输入格式】
第一行,1 个正整数 n,5≤n≤300,表示该校参加评选的学生人数。
接下来的 n 行,每行有 3 个用空格隔开的数字,每个数字值都在 0~100 之间。
说明:第 k 行的 3 个数字依次表示参赛编号为 k-1 选手的参与度积分、积分赛积分和现场赛积分。每个选手的参赛编号即为输入顺序编号 1~n(正好是输入数据的行号减 1)。所给的数据都是正确的,不必检验。
【输出格式】
共五行,每行是两个用空格隔开的正整数,依次表示前 5 名选手参赛编号和总分。
#include<stdio.h>
#include <stdlib.h>
#define MAXN 1000
typedef struct{
int id;
int m1, m2, m3;
int total;
} node;
int compare(const void *a, const void *b){
node *nodeA = (node *)a;
node *nodeB = (node *)b;
if (nodeA->total != nodeB->total)
return nodeB->total - nodeA->total;
if (nodeA->m3 != nodeB->m3)
return nodeB->m3 - nodeA->m3;
return nodeA->id - nodeB->id;
}
int main() {
int n, i;
scanf("%d", &n);
node nodes[MAXN];
for(i = 0; i < n; i++){
nodes[i].id = i + 1;
scanf("%d %d %d", &nodes[i].m1, &nodes[i].m2, &nodes[i].m3);
nodes[i].total = nodes[i].m1 + nodes[i].m2 + nodes[i].m3;
}
qsort(nodes, n, sizeof(node), compare);
for (i = 0; i < 5 && i < n; i++) {
printf("%d %d\n", nodes[i].id, nodes[i].total);
}
return 0;
}