题目描述
给定一个射击比赛成绩单,包含多个选手若干次射击的成绩分数,请对每个选手按其最高3个分数之和进行降序排名,输出降序排名后的选手ID序列。
条件如下
① 一个选手可以有多个射击成绩的分数,且次序不固定。
② 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手。
③ 如果选手的成绩之和相等,则成绩之和相等的选手按照其ID降序排列。
输入描述
输入第一行,一个整数N,表示该场比赛总共进行了N次射击,产生N个成绩分数(2<=N<=100)。
输入第二行,一个长度为N整数序列,表示参与每次射击的选手ID(0<=ID<=99)。
输入第三行,一个长度为N整数序列,表示参与每次射击的选手对应的成绩(0<=成绩<=100)。
输出描述:
符合题设条件的降序排名后的选手ID序列文章来源:https://www.toymoban.com/news/detail-722154.html
示例一
输入:
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
题目解析
解题思路
这道题主要考察对java中的map的处理
① 确定数据如何存储,map<Integer,ArrayList<Integer>>的格式存储【数据的key是选手id,value是分数列表】
② 确定数据如何处理,将map转为stream的形式处理,先过滤掉list小于3的数据,再对list排序取前三的和,按照和的大小排序,和一样的按照key排序文章来源地址https://www.toymoban.com/news/detail-722154.html
java代码实现
package com.HW;
import com.sun.media.jfxmedia.events.BufferListener;
import java.util.*;
import java.util.stream.Collector;
import java.util.stream.Collectors;
/**
* @ClassName : ShootGame
* @Author : kele
* @Date: 2023/10/22 11:01
* @Description : 射击比赛
*/
public class ShootGame {
public static void main(String[] args) {
int n = 13;
String id = "3,3,7,4,4,4,4,7,7,3,5,5,5,6";
String score = "53,80,68,24,39,76,66,16,100,55,53,80,55,90";
handle(n, id, score);
}
public static void handle(int n, String id, String score) {
HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
int[] ids = Arrays.stream(id.split(",")).mapToInt(Integer::parseInt).toArray();
int[] scores = Arrays.stream(score.split(",")).mapToInt(Integer::parseInt).toArray();
for (int i = 0; i < ids.length; i++) {
ArrayList<Integer> list = map.getOrDefault(ids[i], new ArrayList<>());
list.add(scores[i]);
map.put(ids[i], list);
}
StringBuilder builder = new StringBuilder();
map.entrySet().stream().filter(x -> x.getValue().size() >= 3)
.sorted(new Comparator<Map.Entry<Integer, ArrayList<Integer>>>() {
@Override
public int compare(Map.Entry<Integer, ArrayList<Integer>> o1, Map.Entry<Integer, ArrayList<Integer>> o2) {
int sum1 = 0;
int sum2 = 0;
ArrayList<Integer> value1 = o1.getValue();
ArrayList<Integer> value2 = o2.getValue();
Collections.sort(o1.getValue(), Collections.reverseOrder());
Collections.sort(o2.getValue(), Collections.reverseOrder());
for (int i = 0; i < 3; i++) {
sum1 += value1.get(i);
sum2 += value2.get(i);
}
if (sum1 == sum2) {
return o2.getKey() - o1.getKey();
}
return sum2 - sum1;
}
}).forEach(x -> {
builder.append(x.getKey()).append(",");
});
System.out.println(builder.substring(0,builder.length()-1));
}
}
到了这里,关于统计射击比赛成绩的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!