给定一个射击比赛成绩单
包含多个选手若干次射击的成绩分数
请对每个选手按其最高三个分数之和进行降序排名
输出降序排名后的选手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
public static void main(String[] args) {
class Shoot {
/**
* 选手编号
*/
private int no;
/**
* 这次射击的成绩
*/
private int score;
public Shoot(int no, int score) {
this.no = no;
this.score = score;
}
public int getNo() {
return no;
}
public void setNo(int no) {
this.no = no;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
}
Scanner scanner = new Scanner(System.in);
int size = scanner.nextInt();
scanner.nextLine();
System.out.println(size);
List<Shoot> scoreList = new ArrayList<>();
String[] noStr = scanner.nextLine().split(",");
String[] scoreStr = scanner.nextLine().split(",");
//记录选手射击的次数
HashMap<Integer, Integer> mapCount = new HashMap<>(size);
for (int i = 0; i < size; i++) {
int no = Integer.parseInt(noStr[i]);
if (mapCount.containsKey(no)) {
mapCount.put(no, mapCount.get(no) + 1);
} else {
mapCount.put(no, 1);
}
//记录选手每次射击的成绩
scoreList.add(new Shoot(no, Integer.parseInt(scoreStr[i])));
}
//筛选移除成绩少于三个的选手
mapCount.entrySet().removeIf(next -> next.getValue() < 3);
//将成绩集合排序 方便计算前三的总合
List<Shoot> res = new ArrayList<>(); //用于封装输出的结果
for (Integer no : mapCount.keySet()) {
int sum = scoreList.stream().filter((cur) -> cur.getNo() == no) //筛选条件 查询编号为no的
.sorted(Comparator.comparing(Shoot::getScore, Comparator.reverseOrder()) //按成绩倒序
.thenComparing(Shoot::getNo, Comparator.reverseOrder())) //按编号倒序
.limit(3) //保留前三位
.mapToInt(Shoot::getScore) //取score的值
.sum(); //求和
res.add(new Shoot(no, sum));
}
//对输出结果按规则排序
res = res.stream().sorted(Comparator.comparing(Shoot::getScore, Comparator.reverseOrder())
.thenComparing(Shoot::getNo, Comparator.reverseOrder()))
.collect(Collectors.toList());
for (Shoot c : res) {
System.out.println("no:" + c.getNo() + ";sum:" + c.getScore());
}
}