<center>
</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;
}