<center>

问题 : 奥运排序问题


</center>

题目描述

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

输入

有多组数据。
第一行给出国家数N,要求排名的国家数M,国家号从0到N-1。
第二行开始的N行给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。
接下来一行给出M个国家号。

输出

排序有4种方式: 金牌总数 奖牌总数 金牌人口比例 奖牌人口比例
对每个国家给出最佳排名排名方式 和 最终排名
格式为: 排名:排名方式
如果有相同的最终排名,则输出排名方式最小的那种排名,对于排名方式,金牌总数 < 奖牌总数 < 金牌人口比例 < 奖牌人口比例
如果有并列排名的情况,即如果出现金牌总数为 100,90,90,80.则排名为1,2,2,4.
每组数据后加一个空行。

样例输入

4 44 8 16 6 24 8 22 12 40 1 2 34 28 10 18 11 28 12 38 13 40 3

样例输出

1:31:12:11:21:11:1

提示

本题需要解决的是奥运会中各国家最有利的排名方式以及名次。只要进行五次排序即可。首先读入各国家信息,写好国家编号,计算和存储排名所需要的数据。然后按四种排名方式分别对需要排名的国家进行排名,并记录名次。最后使用国家编号对国家进行排名。这样就可以输出结果了。

题意描述:

将给定的国家进行排序,并输出排名最靠前的一种排名名次及它的排名类型。

解题思路:

用结构题存储国家信息排名,再根据不同类型进行排名,输出最好名次及这种排名的类型。(之前写了个特别麻烦的,这个是在网上淘的,不过原代码有一些小错误,自己又加了些注释)

程序代码:

#include<stdio.h>
//结构体存储 
typedef struct Country{    
    int GoldNum;//金牌数    
    int MedalNum;//奖牌数    
    int PeopleNum;//人口数    
    double GoldRatio;//金牌比例    
    double MedalRatio;//奖牌比例    
    int SKind;//最佳排名类型    
    int BestRank;//最佳排名    
    int Rank;//当前排名    
}Country;    

Country country[1000];//用来存储每个国家的信息    
  
int main () {    
    int N,M,i,j,ID;     
    Country countrySort[1001];//用来存储需要排名的国家信息   
    while(scanf("%d %d",&N,&M) != EOF)
	{     
        //给定国家或地区的奥运金牌数,奖牌数,人口数(百万)。    
        for(i = 0;i < N;i++)
		{    
            scanf("%d %d %d",&country[i].GoldNum,&country[i].MedalNum,&country[i].PeopleNum);    
            country[i].GoldRatio = country[i].GoldNum * 1.0 / country[i].PeopleNum;//求出金牌比例 
            country[i].MedalRatio = country[i].MedalNum * 1.0 / country[i].PeopleNum;//求出奖牌比例 
        }    
        //给出要排序的M个国家号。
        for(i = 0;i < M;i++)
		{        
            scanf("%d",&ID);    
            countrySort[i] = country[ID];//将需要排名的国家单独存储 
        }
        for(i = 0;i < M;i++)
		{    
            //金牌数排序    
            countrySort[i].Rank = 1;//金牌数初始排名第一   
            for(j = 0;j < M;j++)
			{    
                if(countrySort[i].GoldNum < countrySort[j].GoldNum)
				{    
                    countrySort[i].Rank++;//如果有比此国家多的金牌数,排名加一   
                }    
            }    
            countrySort[i].BestRank = countrySort[i].Rank;//先将第一种排名看做最佳排名 
            countrySort[i].SKind = 1;//排名类型为第一种 
            //奖牌数排序    
            countrySort[i].Rank = 1;//奖牌数初始排名第一 
            for(j = 0;j < M;j++)
			{    
                if(countrySort[i].MedalNum < countrySort[j].MedalNum)
				{    
                    countrySort[i].Rank++; //如果有比此国家多的奖牌数,排名加一    
                }    
            }    
            if(countrySort[i].Rank < countrySort[i].BestRank)//如果这种排名名次更靠前,将此排名更新为最佳排名,并将更新为此种排名类型 
			{    
                countrySort[i].BestRank = countrySort[i].Rank;    
                countrySort[i].SKind = 2;    
            }    
            //printf("J2:%d\n",countrySort[i].Rank);    
            //金牌人口比例排序    
            countrySort[i].Rank = 1;    
            for(j = 0;j < M;j++)
			{    
                if(countrySort[i].GoldRatio < countrySort[j].GoldRatio){    
                    countrySort[i].Rank++;    
                }    
            }    
            if(countrySort[i].Rank < countrySort[i].BestRank)
			{    
                countrySort[i].BestRank = countrySort[i].Rank;    
                countrySort[i].SKind = 3;    
            }    
               
            //奖牌人口比例排序    
            countrySort[i].Rank = 1;    
            for(j = 0;j < M;j++)
			{    
                if(countrySort[i].MedalRatio < countrySort[j].MedalRatio)
				{    
                    countrySort[i].Rank++;    
                }    
            }    
            if(countrySort[i].Rank < countrySort[i].BestRank)
			{    
                countrySort[i].BestRank = countrySort[i].Rank;    
                countrySort[i].SKind = 4;    
            }    
              
            //输出    
            printf("%d:%d\n",countrySort[i].BestRank,countrySort[i].SKind);    
        }    
        //每组数据后加一个空行。    
        printf("\n");    
    }    
    return 0;    
}