九度OJ 1007:奥运排序问题 (排序)

时间限制:1 秒

内存限制:32 兆

特殊判题:

提交:7344

解决:1568

题目描述:

按要求,给国家进行排名。

输入:
有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。
输出:
排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例 
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例 
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。
样例输入:
4 4
4 8 1
6 6 2
4 8 2
2 12 4
0 1 2 3
4 2
8 10 1
8 11 2
8 12 3
8 13 4
0 3
样例输出:
1:3
1:1
2:1
1:2

1:1
1:1

来源:
2010年浙江大学计算机及软件工程研究生机试真题

思路:

排序题,对基本能力考察的比较多,结构体、变量定义、数组、排序等等。

对于这种排序题,一定要对qsort或者sort非常熟,才能提高做题效率。

本题中我用了指针数组,写法上更加精炼一些,可供参考。


代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
#define N 1000
 
struct record {
    int country;
    double data[4];
    int rank[4];
};
 
typedef int (*PTRFUN)(const void *, const void *);
 
int n, m;
struct record rec[N];
int num[N];
PTRFUN pf[4];
 
int cmp0(const void *b, const void *a)
{
    return (((struct record *)a)->data[0] > ((struct record *)b)->data[0]) ? 1 : -1;
}
 
int cmp1(const void *b, const void *a)
{
    return (((struct record *)a)->data[1] > ((struct record *)b)->data[1]) ? 1 : -1;
}
 
int cmp2(const void *b, const void *a)
{
    return (((struct record *)a)->data[2] > ((struct record *)b)->data[2]) ? 1 : -1;
}
 
int cmp3(const void *b, const void *a)
{
    return (((struct record *)a)->data[3] > ((struct record *)b)->data[3]) ? 1 : -1;
}
 
int cmp4(const void *a, const void *b)
{
    return ((struct record *)a)->country - ((struct record *)b)->country;
}
 
int main(void)
{
    int i, j, k;
    pf[0] = cmp0;
    pf[1] = cmp1;
    pf[2] = cmp2;
    pf[3] = cmp3;
 
    while (scanf("%d", &n) != EOF && n)
    {
        scanf("%d", &m);
        for (i=0; i<n; i++)
        {
            rec[i].country = N;
            int people;
            scanf("%lf%lf%d", &rec[i].data[0], &rec[i].data[1], &people);
            rec[i].data[2] = rec[i].data[0]/people;
            rec[i].data[3] = rec[i].data[1]/people;
        }
        for (i=0; i<m; i++)
        {
            scanf("%d", &num[i]);
            rec[num[i]].country = i;
        }
        qsort(rec, n, sizeof(rec[0]), cmp4);
 
        for (i=0; i<4; i++)
        {
            qsort(rec, m, sizeof(rec[0]), *pf[i]);
            k = 0;
            for (j=0; j<m; j++)
            {
                //printf("country=%d, data[i]=%d\n", rec[j].country, rec[j].data[i]);
                if (j == 0)
                    k++;
                else if (rec[j].data[i] != rec[j-1].data[i])
                    k = j+1;
                rec[j].rank[i] = k;
            }
        }
 
        qsort(rec, m, sizeof(rec[0]), cmp4);
        for (i=0; i<m; i++)
        {
            struct record *r = &rec[i];
            k = 0;
            //printf("rec[%d]->rank[0]=%d\n", num[i], r->rank[0]);
            for (j=1; j<4; j++)
            {
                //printf("rec[%d]->rank[%d]=%d\n", num[i], j, r->rank[j]);
                if(r->rank[j] < r->rank[k])
                    k = j;
            }
            printf("%d:%d\n", r->rank[k], k+1);
        }
        printf("\n");
    }
 
    return 0;
}
/**************************************************************
    Problem: 1007
    User: liangrx06
    Language: C
    Result: Accepted
    Time:0 ms
    Memory:972 kb
****************************************************************/



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