-
题目描述:
-
按要求,给国家进行排名。
-
输入:
-
有多组数据。
第一行给出国家数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
这道题,我提交了无数次,每次都是Wrong,并且自认为没有问题。后来在网上看了别人A的代码,也没看出什么问题。终于,在我看了一遍又一遍之后,发现了问题所在。题目中要求的是 对于给定的几个国家排序,不是对所有的国家排序,也就是说最后排的名次的话,其余国家是不算在里面的。。好吧,我彻底服了。这道题做的时候耐心一点,没有难度,关键就是要细心。
#include <iostream> using namespace std; int main(){ int N,M; while(cin>>N>>M){ int *GoldMedal = new int[N]; int *SumMedal = new int[N]; int PeopleSum; double *GoldRate = new double[N]; double *SumMedalRate = new double[N]; for(int i=0;i<N;i++){ cin>>GoldMedal[i]>>SumMedal[i]>>PeopleSum; GoldRate[i] = (double)GoldMedal[i]/(double)PeopleSum; SumMedalRate[i] = (double)SumMedal[i]/(double)PeopleSum; } int *Number = new int[M]; for(int i=0;i<M;i++){ cin>>Number[i]; } for(int i=0;i<M;i++){ int Way = 0,Sequeue = 0; //最好的排名方式和最好的排名 int Sequeue_Way[5]; //每一种排名方式对应的名次 for(int j=0;j<5;j++) Sequeue_Way[j] = 1; //先假设每种方式下的排名都是第一名 for(int j=0;j<M;j++){ if(GoldMedal[Number[j]] > GoldMedal[Number[i]]){ Sequeue_Way[0]++; } if(SumMedal[Number[j]] > SumMedal[Number[i]]){ Sequeue_Way[1]++; } if(GoldRate[Number[j]] > GoldRate[Number[i]]){ Sequeue_Way[2]++; } if(SumMedalRate[Number[j]] > SumMedalRate[Number[i]]){ Sequeue_Way[3]++; } } int Min = N+10; //求出最好的排名 for(int k=0;k<4;k++){ if(Sequeue_Way[k] < Min){ Way = k+1; Sequeue = Sequeue_Way[k]; Min = Sequeue_Way[k]; } } cout<<Sequeue<<":"<<Way<<endl; } cout<<endl; delete []GoldMedal; delete []SumMedal; delete []GoldRate; delete []SumMedalRate; delete []Number; } return 0; }