获奖名单

获奖名单

Description

一年一度的校赛马上就要开始了,这次校赛可能使用传统的OJ形式进行。现在,你得到了参赛人员的ac记录,出题小组希望你来计算排名并求出获奖名单。

Input

多组测试数据。
第一行是两个整数n(50<=n<=1000),m(1<=m<=n),表示有n个人参加比赛,前m名获奖。
接下来有n行,每行三个数id c t,表示一条ac记录。其中id表示参赛人员的编号(1<=id<=n且id唯一),c表示出题数,t表示总罚时。
注:排名是先按出题数排序(大的在前),如果题数相同按罚时排序(小的在前),如果前两者都相同的话则按id排序(小的在前)。 

Output

输出m行,表示前m名获奖的参赛队员的id。

Sample Input

5 3

1 2 100

2 3 300

5 2 99

3 1 20

4 3 250


Sample Output


4

2

5


主要考查了排序的稳定性问题,题目中如果前两者都相同的话则按id排序(小的在前),冒泡排序是稳定的,有些排序算法会打乱原有顺序,如选择排序和快速排序。在本题里我选择了冒泡排序。

#include<stdio.h>

#define MaxSive 1020

struct com{

    int id;

    int c;

    int t;

};

int main()

{

    int n,m,i,j;

    struct com std[MaxSive],temp;

    scanf("%d %d",&n,&m);

    for(i=0;i<n;i++)

        scanf("%d %d %d",&std[i].id,&std[i].c,&std[i].t);

    for(i=0;i<n;i++)

        for(j=n-1;j>i;j--)

        {

          if(std[i].c<std[j].c)

          {

              temp = std[i];

              std[i] = std[j];

              std[j] = temp;

          }

            if(std[i].c==std[j].c)

            {

             if(std[i].t>std[j].t)

             {

                 temp = std[i];

                 std[i] = std[j];

                 std[j] = temp;

             }

            }

        }

    for(i=0;i<m;i++)

        printf("%d\n",std[i].id);

    

    return 0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值