@yexiaoqi
2022-05-24T11:46:51.000000Z
字数 1600
阅读 489
刷题
题目:给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数
请对每个选手按其最高三个分数之和进行降序排名,输出降序排名后的选手id序列
条件如下
1. 一个选手可以有多个射击成绩的分数,且次序不固定
2. 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
3. 如果选手的成绩之和相等,则相等的选手按照其id降序排列
难度:*
输入描述:输入第一行,一个整数N,表示该场比赛总共进行了N次射击,产生N个成绩分数,2<=N<=100
输入第二行,一个长度为N整数序列,表示参与每次射击的选手id,0<=id<=99
输入第三行,一个长度为N整数序列,表示参与每次射击选手对应的成绩0<=成绩<=100
输出描述:符合题设条件的降序排名后的选手ID序列
示例一
输入:13
3,3,7,4,4,4,4,7,7,3,5,5,5
53,80,68,24,39,76,66,16,100,55,53,80,55
输出:5,3,7,4
说明:该场射击比赛进行了13次,参赛的选手为{3,4,5,7},
3号选手成绩53,80,55 最高三个成绩的和为188
4号选手成绩24,39,76,66 最高三个成绩的和为181
5号选手成绩53,80,55 最高三个成绩的和为188
7号选手成绩68,16,100 最高三个成绩的和为184
比较各个选手最高3个成绩的和,有3号=5号>7号>4号,由于3号和5号成绩相等 且id 5>3,所以输出5,3,7,4
链接:http://www.amoscloud.com/?p=3561
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n = sc.nextInt();
String[] id = sc.next().split(",");
String[] score = sc.next().split(",");
Map<Integer, List<Integer>> map = new HashMap<>();
for (int i=0; i<id.length; i++){
int num = Integer.parseInt(id[i]);
List<Integer> list = map.getOrDefault(num, new ArrayList<>());
list.add(Integer.parseInt(score[i]));
map.put(num, list);
}
String s = map.entrySet().stream()
.filter(e -> e.getValue().size() >= 3)//成绩少于3个的作废
.sorted(((e1, e2) -> {
List<Integer> list1 = e1.getValue();
List<Integer> list2 = e2.getValue();
list1.sort(((o1,o2) -> o2-o1));
list2.sort(((o1,o2) -> o2-o1));
Integer sum1 = 0;
Integer sum2 = 0;
for (int i=0; i<3; i++) {
sum1 += list1.get(i);
sum2 += list2.get(i);
}
Integer id1 = e1.getKey();
Integer id2 = e2.getKey();
//如果得分之和相等,按id降序排列
return sum2-sum1==0 ? id2-id1 : sum2-sum1;
}))
.map(o->o.getKey().toString())
.collect(Collectors.joining(","));
System.out.println(s);
}
}
}