-
题目描述:
-
按要求,给国家进行排名。
-
输入:
-
有多组数据。
第一行给出国家数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
-
------------------------------
-
解析题意:
- 只需要排几个序。最后的那一行如 0 3 只排0和3这一索引
-
就是排名【按最好成绩来排名】+第二次排名。第二次排名,输出最小的,最小的顺序为: 排名方式,金牌总数【1】 < 奖牌总数【2】 < 金牌人口比例【3】 < 奖牌人口比例【4】
-
import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int N, M;/*第一行给出国家数N,要求排名的国家数M,具体序号是最后一行*/ while (cin.hasNext()) { N = cin.nextInt(); M = cin.nextInt(); Contry[] contries = new Contry[N]; Contry[] waitingContries = new Contry[M]; for (int i = 0; i < N; i++) { contries[i] = new Contry(); contries[i].setName(i); contries[i].setGold(cin.nextInt());// 金牌数 contries[i].setMedal(cin.nextInt());//奖牌数 contries[i].setPopulation(cin.nextInt());//人口数 double GDP = contries[i].getGold() * 1.0 / contries[i].getPopulation(); //金牌平均数 double MDP = contries[i].getMedal() * 1.0 / contries[i].getPopulation(); //奖牌平均数 contries[i].setGDP(GDP); contries[i].setMDP(MDP); } for (int i = 0; i < M; i++) { waitingContries[i] = new Contry(); waitingContries[i] = contries[cin.nextInt()];//要排名的每一家赋值 } for (int i = 0; i < M; i++) { //两个for循环,依次比较 // 金牌数排名 waitingContries[i].CRanking = 1; for (int j = 0; j < M; j++) { if (waitingContries[i].getGold() < waitingContries[j].getGold()) { waitingContries[i].CRanking++; //如果是最大,就是初始化的1了; } } waitingContries[i].Ranking = waitingContries[i].CRanking; waitingContries[i].RankingType = 1; // 奖牌数排名 waitingContries[i].CRanking = 1; for (int j = 0; j < M; j++) { if (waitingContries[i].getMedal() < waitingContries[j].getMedal()) { waitingContries[i].CRanking++; } } if (waitingContries[i].Ranking > waitingContries[i].CRanking) { waitingContries[i].Ranking = waitingContries[i].CRanking; //采用最小奖牌数排名 waitingContries[i].RankingType = 2; } // 金牌人口比例排名 waitingContries[i].CRanking = 1; for (int j = 0; j < M; j++) { if (waitingContries[i].getGDP() < waitingContries[j].getGDP()) { waitingContries[i].CRanking++; } } if (waitingContries[i].Ranking > waitingContries[i].CRanking) { waitingContries[i].Ranking = waitingContries[i].CRanking; //采用最小金牌人口比例排名 waitingContries[i].RankingType = 3; } // 奖品人口比例排名 waitingContries[i].CRanking = 1; for (int j = 0; j < M; j++) { if (waitingContries[i].getMDP() < waitingContries[j].getMDP()) { waitingContries[i].CRanking++; } } if (waitingContries[i].Ranking > waitingContries[i].CRanking) { waitingContries[i].Ranking = waitingContries[i].CRanking; waitingContries[i].RankingType = 4; //采用最小奖牌人口比例排名 } // 输出结果 System.out.println(waitingContries[i].Ranking + ":" + waitingContries[i].RankingType); } //每组数据后加一个空行。 System.out.println(); } } public static class Contry { private int Name; private int Gold; private int Medal; private int Population; private double GDP; private double MDP; private int Ranking; private int CRanking; private int RankingType; public int getName() { return Name; } public void setName(int name) { Name = name; } public int getGold() { return Gold; } public void setGold(int gold) { Gold = gold; } public int getMedal() { return Medal; } public void setMedal(int medal) { Medal = medal; } public int getPopulation() { return Population; } public void setPopulation(int population) { Population = population; } public double getGDP() { return GDP; } public void setGDP(double gDP) { GDP = gDP; } public double getMDP() { return MDP; } public void setMDP(double mDP) { MDP = mDP; } public int getRanking() { return Ranking; } public void setRanking(int ranking) { Ranking = ranking; } public int getRankingType() { return RankingType; } public void setRankingType(int rankingType) { RankingType = rankingType; } } }