首页 > 代码库 > 奥运排序问题 分数:2

奥运排序问题 分数: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  

 

奥运排序问题 分数:2