zoukankan      html  css  js  c++  java
  • 九度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
    ", 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
    ", num[i], r->rank[0]);
                for (j=1; j<4; j++)
                {
                    //printf("rec[%d]->rank[%d]=%d
    ", num[i], j, r->rank[j]);
                    if(r->rank[j] < r->rank[k])
                        k = j;
                }
                printf("%d:%d
    ", r->rank[k], k+1);
            }
            printf("
    ");
        }
     
        return 0;
    }
    /**************************************************************
        Problem: 1007
        User: liangrx06
        Language: C
        Result: Accepted
        Time:0 ms
        Memory:972 kb
    ****************************************************************/



    编程算法爱好者。
  • 相关阅读:
    校园WebGIS开发与实践(论文部分)
    初来博客园,请多多关照
    MIFtoTAB and TABtoMIF(MIF和TAB互转小工具)
    MIFtoSHP通用转换工具
    activity 对home 按钮事件的处理
    在XML布局文件里,会遇到的一些单位
    自己写的Adapter 无法被鼠标点中问题
    linux 下查看文件修改时间 等
    Android中使用GridView分页显示系统所安装的应用,支持拖动与手势滑动
    getLaunchIntentForPackage 获取到的为null原因
  • 原文地址:https://www.cnblogs.com/liangrx06/p/5084024.html
Copyright © 2011-2022 走看看