九度OJ 题目1007:奥运排序问题

题目1007:奥运排序问题

/********************************* 
*   日期:2017-2-19
*   作者:qiminghao 
*   题号: 九度OJ 题目1007:奥运排序问题  
*   来源:http://ac.jobdu.com/problem.php?pid=1007
*   结果:AC 
*   来源:2010年浙江大学计算机及软件工程研究生机试真题
*   总结: 
**********************************/ 

#include<stdio.h>

struct Country
{
    //编号
    int ID;
    //金牌数
    int goldMedal;
    //奖牌数
    int allMedal;
    //人口数
    int people;
    //金牌人口比例
    double goldProportion;
    //奖牌人口比例
    double allProportion;
    //最佳排名
    int ranking;
    //最佳排名排名方式
    int mode;
    //是否参与排名
    bool isRanking;
};

//所有国家信息
struct Country ctry[500];

int main()
{
    int n,m,i=0,j=0,num;
    //排名
    int ranking[5];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        //输入n个国家的奥运金牌数,奖牌数,人口数(百万)
        for(i=0;i<n;i++)
        {
            scanf("%d%d%d",&ctry[i].goldMedal,&ctry[i].allMedal,&ctry[i].people);
            ctry[i].goldProportion=(double)ctry[i].goldMedal / (double)ctry[i].people;
            ctry[i].allProportion=(double)ctry[i].allMedal / (double)ctry[i].people;
            ctry[i].ID=i;
            ctry[i].isRanking=false;
            ctry[i].ranking=0;
            ctry[i].mode=0;
        }
        //输入m个待排序国家编号
        for(i=0;i<m;i++)
        {
            scanf("%d",&num);
            ctry[num].isRanking=true;
        }
        //得出待排序国家的最佳排名及其排名方式
        for(i=0;i<n;i++)
        {
            if(ctry[i].isRanking==false)
                continue;
            else
            {
                //根据奖牌人口比例排名
                ranking[4]=1;
                for(j=0;j<n;j++)
                    if(ctry[i].allProportion<ctry[j].allProportion && ctry[j].isRanking==true)
                        ranking[4]++;
                //根据金牌人口比例排名
                ranking[3]=1;
                for(j=0;j<n;j++)
                    if(ctry[i].goldProportion<ctry[j].goldProportion && ctry[j].isRanking==true)
                        ranking[3]++;
                //根据奖牌数排名
                ranking[2]=1;
                for(j=0;j<n;j++)
                    if(ctry[i].allMedal<ctry[j].allMedal && ctry[j].isRanking==true)
                        ranking[2]++;
                //根据金牌数排名
                ranking[1]=1;
                for(j=0;j<n;j++)
                    if(ctry[i].goldMedal<ctry[j].goldMedal && ctry[j].isRanking==true)
                        ranking[1]++;
                ranking[0]=ranking[4];
                //选出最佳排名及其排名方式
                for(j=4;j>0;j--)
                    if(ranking[j]<=ranking[0])
                    {
                        ranking[0]=ranking[j];
                        ctry[i].ranking=ranking[j];
                        ctry[i].mode=j;
                    }
            }
        }
        //输出排名结果
        for(i=0;i<n;i++)
        {
            if(ctry[i].isRanking==false)
                continue;
            else
                printf("%d:%d\n",ctry[i].ranking,ctry[i].mode);
        }
        printf("\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值