奥运排序问题 分数:2
标签
- 排序
题目描述
按要求,给国家进行排名。
输入格式
有多组数据。
第一行给出国家数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
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。