-
题目描述:
-
按要求,给国家进行排名。
-
输入:
-
有多组数据。
第一行给出国家数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
代码:/************************************** *Date:2014.02.09 *Function:结构体排序 * 奥运排序:1007 **************************************/ #include<stdio.h> #include<iostream> #include<cstdio> #include<algorithm> using namespace std; struct Nation{ int num; double orderValue[4]; int order[4];//这一个数组,下标代表排名方式,值代表该排名方式的名次 }na[100]; bool cmp0(Nation a,Nation b)//cmp0,num { return a.num<b.num; } bool cmp1(Nation a,Nation b)//cmp1,gold { return a.orderValue[0]>b.orderValue[0]; } bool cmp2(Nation a,Nation b)// { return a.orderValue[1]>b.orderValue[1]; } bool cmp3(Nation a,Nation b) { return a.orderValue[2]>b.orderValue[2]; } bool cmp4(Nation a,Nation b) { return a.orderValue[3]>b.orderValue[3]; } int main() { int n,m,temp,i; int gold,total,pop; while(scanf("%d%d",&n,&m)!=EOF) { //输入全部国家信息 for(i=0;i<n;i++) { cin>>gold>>total>>pop; na[i].orderValue[0]=gold; na[i].orderValue[1]=total; na[i].orderValue[2]=(double)gold/pop; na[i].orderValue[3]=(double)total/pop; na[i].num=i; } //存需要比较的国家 for(i=0;i<m;i++) { cin>>temp; na[i]=na[temp]; } //按金牌总数排序cmp1,orderValue[0],gold sort(na,na+m,cmp1); na[0].order[0]=1; for(i=1;i<m;i++) { if(na[i-1].orderValue[0]==na[i].orderValue[0]) na[i].order[0]=na[i-1].order[0]; else na[i].order[0]=i+1; } //按奖牌总数排序 cmp2,orderValue[1],total sort(na,na+m,cmp2); na[0].order[1]=1; for(i=1;i<m;i++) { if(na[i-1].orderValue[1]==na[i].orderValue[1]) na[i].order[1]=na[i-1].order[1]; else na[i].order[1]=i+1; } //按金牌比例排序 cmp3,orderValue[2],gold/pop sort(na,na+m,cmp3); na[0].order[2]=1; for(i=1;i<m;i++) { if(na[i-1].orderValue[2]==na[i].orderValue[2]) na[i].order[2]=na[i-1].order[2]; else na[i].order[2]=i+1; } //按奖牌比例排序 cmp4,orderValue[3],total/pop sort(na,na+m,cmp4); na[0].order[3]=1; for(i=1;i<m;i++) { if(na[i-1].orderValue[3]==na[i].orderValue[3]) na[i].order[3]=na[i-1].order[3]; else na[i].order[3]=i+1; } //最后按国家序号排序,按序输出每个国家的最佳排名,及对应方式 cmp0,num sort(na,na+m,cmp0); for(i=0;i<m;i++) { temp=0; for(int j=1;j<4;j++) { if(na[i].order[j]<na[i].order[temp]) temp=j; } cout<<na[i].order[temp]<<':'<<temp+1<<endl; } cout<<endl; } return 0; }
-