首页 > 代码库 > 题目1007:奥运排序问题

题目1007:奥运排序问题

题目描述:

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

输入:
有多组数据。
第一行给出国家数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
来源:
2010年浙江大学计算机及软件工程研究生机试真题
-----------------------------------------------------------------------
思路:
  • 对于国家或地区这个数据类型,考虑到其具有以下内容:金牌数(cin),奖牌数(cin),人口数(cin),4种方式排名: 金牌总数 奖牌总数 金牌人口比例(double) 奖牌人口比例(double),最佳排名排名方式(cout) 和 最终排名(cout),可用结构体类型:
struct contr{	int a[3];//国家信息	double b[4];//四种排名方式所根据的数据	int c[4];//四种方式的排名	int d[2];//最终排名和排名方式}
  • 接下来要进行两次排序:一个国家四种方式排名和根据一个国家四种方式排名和排名方式得出最终排名和排名方式(求四个数的最小那个)

    这里对一个国家四种方式排名时,不能单纯地改变国家顺序来排序,而是借助一维整形数组,把名次和名次所对应的国家编号映射到这个数组上。。

    数组下标从1开始,记录名次;数组的值记录国家编号。

        

                  

上代码:
 1 #include<stdio.h> 2 #define N 300 3 struct contr{ 4     int a[3];//国家信息 5     double b[4];//四种方式排名所根据的数据 6     int c[4];//四种方式的排名 7     int d[2];//最终排名和排名方式 8 }q[N]; 9 int main(int argc, char const *argv[])10 {11     int n,m;12     int i,j,k,l;13     int x[N];//用于排名14     int w[N];//w记录参加评选国家编号15     int t;16     while(scanf("%d %d",&n,&m)!=EOF)17     {18         for(i=0;i<n;i++)19             for(j=0;j<3;j++)20                 scanf("%d",&q[i].a[j]);21         for(i=0;i<m;i++)22             scanf("%d",&w[i]);23 24         for(i=0;i<m;i++)//初始化4种排名所根据的数据25         {26             q[w[i]].b[0]=(double)q[w[i]].a[0];27             q[w[i]].b[1]=(double)q[w[i]].a[1];28             q[w[i]].b[2]=q[w[i]].a[0]/(double)q[w[i]].a[2];29             q[w[i]].b[3]=q[w[i]].a[1]/(double)q[w[i]].a[2];30         }31         for(i=0;i<4;i++)//四种排名32         {33             for(j=1;j<m+1;j++)34                 x[j]=j-1;//初始化排名,x[j]表示排名为j的所对应编号为j-135             for(k=1;k<m;k++)36                 for(l=k+1;l<m+1;l++)37                     if(q[w[x[k]]].b[i]<q[w[x[l]]].b[i])38                     {39                         t=x[k];x[k]=x[l];x[l]=t;40                     }41             q[w[x[1]]].c[i]=1;42             for(j=2;j<m+1;j++)43                 if(q[w[x[j]]].b[i]!=q[w[x[j-1]]].b[i])44                     q[w[x[j]]].c[i]=j;45                 else46                     q[w[x[j]]].c[i]=q[w[x[j-1]]].c[i];47         }48         for(i=0;i<m;i++)//求出最终排名和所用排名方式49         {50             q[w[i]].d[0]=q[w[i]].c[0];51             q[w[i]].d[1]=1;52             for(j=1;j<4;j++)53             {54                 if(q[w[i]].d[0]>q[w[i]].c[j])55                 {56                     q[w[i]].d[0]=q[w[i]].c[j];57                     q[w[i]].d[1]=j+1;58                 }59             }60         }61         for(i=0;i<m;i++)62         {63             printf("%d:%d\n",q[w[i]].d[0],q[w[i]].d[1]);64         }65         printf("\n");66     }67     return 0;68 }