选拔赛排名

【题目描述】

    小民想通过选拔赛加入学校程序设计竞赛实验班,他了解到选拔赛规则如下:每位选手具有参与度积分、积分赛积分、现场赛积分 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值