奥运排序问题 分数:2

 

时间限制:1 秒
内存限制:32 兆
特殊判题:
提交:62
解决:31

标签

  • 排序

题目描述

 

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

 

输入格式

 

有多组数据。
第一行给出国家数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



  1 //在九度WA,但是其他OJAC
  2 
  3  
  4 #include <iostream>
  5 #include <algorithm>
  6 using namespace std;
  7 struct E
  8 {
  9     int num,golde,model,people;
 10 int oder[4];
 11 }buf[100000];
 12  
 13 bool cmp0(E a,E b)
 14 {
 15 return a.num<b.num;
 16 }
 17  
 18 bool cmp1(E a,E b)
 19 {
 20 return a.golde>b.golde;
 21 }
 22  
 23 bool cmp2(E a,E b)
 24 {
 25 return a.model>b.model;
 26 }
 27  
 28 bool cmp3(E a,E b)
 29 {
 30 return (a.golde/a.people)>(b.golde/b.people);
 31 }
 32  
 33 bool cmp4(E a,E b)
 34 {
 35 return (a.model/a.people)>(b.model/b.people);
 36 }
 37  
 38 int main()
 39 {
 40    int N,M;
 41    while(cin>>N>>M)
 42    {
 43       for(int i=0;i<N;i++)
 44  {
 45  buf[i].num=i;
 46  cin>>buf[i].golde>>buf[i].model>>buf[i].people;
 47  }
 48  for(int i=0;i<M;i++)
 49  {
 50    int temp;
 51 cin>>temp;
 52 buf[i]=buf[temp];
 53  }
 54        
 55  sort(buf,buf+M,cmp1);//1
 56  for(int i=0;i<M;i++)
 57  {
 58  if(i!=0&&buf[i-1].golde==buf[i].golde)
 59  buf[i].oder[0]=buf[i-1].oder[0];
 60  else
 61  buf[i].oder[0]=i+1;
 62  
 63  }
 64  
 65  
 66   sort(buf,buf+M,cmp2);//2
 67  for(int i=0;i<M;i++)
 68  {
 69  if(i!=0&&buf[i-1].model==buf[i].model)
 70  buf[i].oder[1]=buf[i-1].oder[1];
 71  else
 72  buf[i].oder[1]=i+1;
 73  
 74  }
 75  
 76  
 77   sort(buf,buf+M,cmp3);//3
 78  for(int i=0;i<M;i++)
 79  {
 80  if(i!=0&&(buf[i-1].golde/buf[i-1].people)==(buf[i].golde/buf[i].people))
 81  buf[i].oder[2]=buf[i-1].oder[2];
 82  else
 83  buf[i].oder[2]=i+1;
 84  }
 85  
 86  
 87   sort(buf,buf+M,cmp4);//4
 88  for(int i=0;i<M;i++)
 89  {
 90  if(i!=0&&(buf[i-1].model/buf[i-1].people)==(buf[i].model/buf[i].people))
 91  buf[i].oder[3]=buf[i-1].oder[3];
 92  else
 93  buf[i].oder[3]=i+1;
 94  }
 95  
 96  sort(buf,buf+M,cmp0);
 97  for(int i=0;i<M;i++)
 98  {
 99  int index=0;
100     for(int j=0;j<4;j++)
101 {
102 if(buf[i].oder[j]<buf[i].oder[index])
103 index=j;
104 }
105  
106 cout<<buf[i].oder[index]<<":"<<index+1<<endl;
107  }
108  cout<<endl;
109    }
110    return 0;
111 }  
112  

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。