首页 > 其他分享 >射击比赛

射击比赛

时间:2023-08-10 19:24:33浏览次数:34  
标签:map 比赛 Stream 降序 选手 射击 成绩 String

1. 题目

给定一个射击比赛成绩单
包含多个选手若干次射击的成绩分数
请对每个选手按其最高三个分数之和进行降序排名
输出降序排名后的选手ID序列

条件如下:

  1. 一个选手可以有多个射击成绩的分数 且次序不固定
  2. 如果一个选手成绩小于三个 则认为选手的所有成绩无效 排名忽略该选手
  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 = 5 > 7 > 4
由于3和5成绩相等 且5 > 3 所以输出为5,3,7,4

2. 答案

class Test {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) {
            int n = in.nextInt();
            in.nextLine();
            String idStr = in.nextLine();
            String scoreStr = in.nextLine();
            String[] ids = idStr.split(",");
            String[] scores = scoreStr.split(",");
            Map<Integer, List<Integer>> map = new HashMap<>();
            for (int i = 0; i < n; i++) {
                int key = Integer.parseInt(ids[i]);
                int value = Integer.parseInt(scores[i]);
                if (map.containsKey(key)) {
                    map.get(key).add(value);
                } else {
                    List<Integer> list = new ArrayList<>();
                    list.add(value);
                    map.put(key, list);
                }
            }
            solutionStream(map);
        }
    }

    /**
     * Stream 翻译称为 “流”,是 Java8 的新特性之一。 Stream 将要处理的元素看作是流,这时可以借助 Stream API 对流中的元素进行中间操作,比如:筛选、排序、排序等
     *
     * 1.创建Stream : map.entrySet().stream()
     * 2.中间操作
     *  filter: 过滤流,过滤流中的元素,返回一个符合条件的Stream
     *  sorted: 返回一个排序的Stream
     *  limit: 返回前n个元素数据组成的Stream。属于短路操作
     *  map: 转换流,将一种类型的流转换为另外一种流(mapToInt、mapToLong、mapToDouble 返回int、long、double基本类型对应的Stream)
     * 3.终止操作
     *  collect: 聚合操作,封装目标数据,将流转换为其他形式接收,如: List、Set、Map、Array
     *
     * Java 8 流的新类 java.util.stream.Collectors 实现了 java.util.stream.Collector 接口,同时又提供了大量的方法对流 ( stream ) 的元素执行 map and reduce 操作,或者统计操作
     * Collectors.joining() 方法用某个指定的拼接**字符串**把所有元素拼接成一个字符串,并添加可选的前缀和后缀
     *
     * @param map key是选手的id,value是选手的成绩集合
     */
    private static void solutionStream(Map<Integer, List<Integer>> map) {
        String collectStr = map.entrySet().stream()
                .filter(per -> (per.getValue().size() >= 3)) // 成绩少于3个成绩无效
                .sorted((p1, p2) -> {
                    // 成绩降序→取前三→求和
                    int sum1 = p1.getValue().stream().sorted(Comparator.reverseOrder()).limit(3).mapToInt(Integer::valueOf).sum();
                    int sum2 = p2.getValue().stream().sorted(Comparator.reverseOrder()).limit(3).mapToInt(Integer::valueOf).sum();
                    // 最大成绩降序前三加和降序,加和相同的话Id降序
                    if (sum1 == sum2) {
                        return p2.getKey() - p1.getKey();
                    } else {
                        return sum2 - sum1;
                    }
                })
                .map(Map.Entry::getKey) // 取得员工Id
                .map(String::valueOf) // 类型不转没办法joining
                .collect(Collectors.joining(",")); // 拼接字符串
        System.out.println(collectStr);
    }
}

输出结果:

标签:map,比赛,Stream,降序,选手,射击,成绩,String
From: https://www.cnblogs.com/styCy/p/17621290.html

相关文章

  • 【比赛·总结】2023.8 学而思Z6模拟赛
    2023.8学而思Z6模拟赛考试界面:(隐藏)题解反思在本次考试中,作者惨遭爆零。警钟长鸣\(3\)分钟。作者认为,爆零的主要原因在于作者并没有遵从“遇到难题则跳过”的原则,疯狂卡在第一题上,从第\(0\)分钟一直到最后\(1\)秒,除了其中写了一个第二题的暴力,还因为读错题没得分以外,其......
  • 篮球比赛现场信息管理实时展示系统-开发随笔1
    关键字:篮球比赛排球比赛足球比赛 比赛管理训练管理训练数据采集实时展示比赛报分比分展示LED大屏场馆大屏[当前现状]体育场馆内的LED显示屏作为广告、比赛信息显示和比赛实况播放最重要的载体之一,已成为现代化体育场馆的必备设施。各类体育赛事通过显示屏传达给更多......
  • 「闲话」NOI 2023 比赛总结
    Day1打开题面,看到两道计数题,有点小惊讶——根据以往的题目类型看,NOI在一天中出现两道计数类型的题目确实比较罕见。不过冷静了一下,也许这也不是坏事。毕竟数数题是我很擅长的题目。但在NOI以后我意识到并不是这样。读题的时候就觉得这个T1应该非常easy,那就先开T1,越想......
  • CTF比赛复现(我愿称之为狱后改造)
    CTF比赛复现(我愿称之为狱后改造)DASCTF2023&0X401七月暑期挑战赛ez_cms后台文件包含漏洞,弱口令密码登入后台admin123456pearcmd文件包含漏洞W4师傅的关于利用pearcmd进行文件包含的一些总结p神pecl是PHP中用于管理扩展而使用的命令行工具,而pear是pecl依赖的类库。在7.......
  • CTF比赛中Web的php伪协议类型题小结
    php协议类型file://—访问本地文件系统http://—访问HTTP(s)网址ftp://—访问FTP(s)URLsphp://—访问各个输入/输出流(I/Ostreams)zlib://—压缩流data://—数据(RFC2397)glob://—查找匹配的文件路径模式phar://—PHP归档1.php伪协议:需要开启allo......
  • 第二次比赛部分题解
    P7060[NWRRC2014]AlarmClock  #include<bits/stdc++.h>usingnamespacestd;intmain(){intn;cin>>n;intarr[10]={6,2,5,5,4,5,6,3,7,6};boolcheck=false;//对于时间ab:cdfor(inta=0;a<=2;a++){//a最多可以到2(因为最大为23......
  • 第二次比赛出题题解
    第二次比赛题解P1138第k小整数-洛谷|计算机科学教育新生态(luogu.com.cn)主要了解set的用法,set会自动去重和排序#include<bits/stdc++.h>usingnamespacestd;signedmain(){ios::sync_with_stdio(false);cin.tie(nullptr);intn,k;cin>>......
  • 棒球比赛
    你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表ops,其中ops[i]是你需要记录的第i项操作,ops遵循下述规则:整数x-表示本回合新获得分数x"+"......
  • 比赛日志(模拟赛)
    2023.7.15ABC310主要是翻译的问题,读题读了很久。A了C题就结束了。2023.7.15CF885Div.2还是翻译的问题,读题读了很久。C题有点难,这场比赛不好。题面废话贼几把多。赛后解决了翻译问题。......
  • 【动态规划】牛客2023年儿童节比赛 G
    题目链接:https://ac.nowcoder.com/acm/contest/58604/G来源:牛客网设\(f[i]\)表示以\(s[i]\)为结尾的合法序列个数如果\(s[i]\ne1\),那么我们可以在从\(f[i-1]\)到\(f[1]\)所包含的序列后面添加\(s[i]\)构成答案,也可以单独以\(s[i]\)为新的合法序列(也就是后面......