九度OJ 1346:会员积分排序 (排序)

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:967

解决:413

题目描述:

元旦佳节快到了,超市A想要给会员一些奖品。但是奖品有限,所以它需要给这些会员做一个排序,然后将名单输出来。排序的规则是,先按积分排序,如果会员的积分相同则按他的ID排序,因为ID号小则表示他注册的时间早。
现在某超市有每个会员的ID(ID保证不重复)、积分,它想要请你帮忙给排个序。

输入:

输入有多组数据。
每组第一行输入n(1<=n<=1000),m(1<=m<=50),n表示会员个数,m表示奖品个数;之后N行分别是两个整数id和s,id为这个会员的ID,s代表了这个会员的积分。

输出:

对每组输入输出min(m,n)个获奖的会员ID(按积分降序输出,如果积分相同按ID升序输出),每个会员ID一行。

样例输入:
5 3
1 5
2 10
3 3
4 20
5 2
样例输出:
4
2
1

代码:

#include <stdio.h>
#include <stdlib.h>
 
#define N 1000
#define M 50
 
struct node {
    int id;
    int score;
} a[N];
 
int cmp(const void *a, const void *b)
{
    struct node *c = (struct node *)a;
    struct node *d = (struct node *)b;
    if (c->score != d->score)
        return d->score - c->score;
    else
        return c->id - d->id;
}
 
int main(void)
{
    int n, m, i;
 
    while (scanf("%d%d", &n, &m) != EOF)
    {
        for(i=0; i<n; i++)
            scanf("%d%d", &(a[i].id), &(a[i].score));
        qsort(a, n, sizeof(a[0]), cmp);
 
        for (i=0; i<((n<m)?n:m); i++)
            printf("%d\n", a[i].id);
    }
 
    return 0;
}
/**************************************************************
    Problem: 1346
    User: liangrx06
    Language: C
    Result: Accepted
    Time:100 ms
    Memory:920 kb
****************************************************************/


你可能感兴趣的:(排序,C语言,OJ,九度)