题目描述
2012伦敦奥运会即将到来,大家都非常关注奖牌榜的情况,现在我们假设奖牌榜的排名规则如下:
- 首先gold medal数量多的排在前面
- 其次silver medal数量多的排在前面
- 然后bronze medal数量多的排在前面
- 若以上三个条件仍无法区分名次,则以国家名称的字典顺序排定。
我们假设国家名称不超过二十个字符,各类奖牌数不超过100,且大于0.
输入描述
第一行输入一个整数N(0<N<21),代表国家数量,
然后接下来的N行,每行包含:
一个字符串Name表示各个国家的名称和三个整数Gi,Si,Bi表示每个获得的gold medal,silver medal,bronze medal的数量,以空格隔开,如(China 51 20 21),
具体见样例输入。
5
China 32 28 34
England 12 34 22
France 23 33 2
Japan 12 34 25
Rusia 23 43 0
输出描述
输出奖牌榜的依次顺序,只输出国家名称,各占一行,具体见样例输出。
China
Rusia
France
Japan
England
用例
输入 | 5 China 32 28 34 England 12 34 22 France 23 33 2 Japan 12 34 25 Rusia 23 43 0 |
输出 | China Rusia France Japan England |
说明 | 无 |
题目解析
主要考察数组排序(也可以集合排序)
JavaScript算法源码
/* JavaScript Node ACM模式 控制台输入获取 */
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const lines = [];
let n;
rl.on("line", (line) => {
lines.push(line);
if (lines.length === 1) {
n = lines[0] - 0;
}
if (n && lines.length === n + 1) {
lines.shift();
lines
.map((line) => {
const arr = line.split(" ");
return {
name: arr[0],
gold: arr[1] - 0,
silver: arr[2] - 0,
bronze: arr[3] - 0,
};
})
.sort((a, b) => {
return b.gold !== a.gold
? b.gold - a.gold
: b.silver !== a.silver
? b.silver - a.silver
: b.bronze !== a.bronze
? b.bronze - a.bronze
: a.name == b.name
? 0
: a.name > b.name
? 1
: -1;
})
.forEach((country) => {
console.log(country.name);
});
lines.length = 0;
}
});
Java算法源码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
// 输入获取
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
Country[] countries = new Country[n];
for (int i = 0; i < n; i++) {
Country c = new Country(sc.next(), sc.nextInt(), sc.nextInt(), sc.nextInt());
countries[i] = c;
}
getResult(countries);
}
// 算法入口
public static void getResult(Country[] countries) {
Arrays.sort(
countries,
(a, b) ->
b.gold != a.gold
? b.gold - a.gold
: b.silver != a.silver
? b.silver - a.silver
: b.bronze != a.bronze ? b.bronze - a.bronze : a.name.compareTo(b.name));
for (Country country : countries) {
System.out.println(country.name);
}
}
}
class Country {
String name;
int gold;
int silver;
int bronze;
public Country(String name, int gold, int silver, int bronze) {
this.name = name;
this.gold = gold;
this.silver = silver;
this.bronze = bronze;
}
}
Python算法源码
# 输入获取
n = int(input())
countries = []
for i in range(n):
name, gold, silver, bronze = input().split()
countries.append([int(gold), int(silver), int(bronze), name])
# 算法入口
def getResult():
countries.sort(key=lambda x: (-x[0], -x[1], -x[2], x[3]))
for c in countries:
print(c[3])
# 算法调用
getResult()
C算法源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[20];
int gold;
int silver;
int bronze;
} Country;
int cmp(const void* a, const void* b) {
Country* A = (Country*) a;
Country* B = (Country*) b;
if(A->gold != B->gold) {
return B->gold - A->gold;
} else if(A->silver != B->silver) {
return B->silver - A->silver;
} else if(A->bronze != B->bronze) {
return B->bronze - A->bronze;
} else {
return strcmp(A->name, B->name);
}
}
int main() {
int n;
scanf("%d", &n);
Country countries[n];
for(int i=0; i<n; i++) {
scanf("%s", countries[i].name);
scanf("%d", &countries[i].gold);
scanf("%d", &countries[i].silver);
scanf("%d", &countries[i].bronze);
}
qsort(countries, n, sizeof(Country), cmp);
for(int i=0; i<n; i++) {
puts(countries[i].name);
}
return 0;
}
免责声明:
1、IT资源小站为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和IT资源小站的同意
7、IT资源小站管理员和版主有权不事先通知发贴者而删除本文
评论0