华为OD机试 - 统计射击比赛成绩 - 逻辑分析(Java 2023 B卷 100分)

news/2024/7/20 17:42:14 标签: 华为od, java, 开发语言, 七日集训, 学习

在这里插入图片描述

目录

    • 专栏导读
    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、Java算法源码
    • 六、效果展示
      • 1、输入
      • 2、输出
      • 3、说明

华为OD机试 2023B卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

条件如下:

  1. 一个选手可以有多个射击成绩的分数,且次序不固定
  2. 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
  3. 如果选手的成绩之和相等,则成绩之和相等的选手按照其ID降序排列。

二、输入描述

输入第一行,一个整数N,表示该场比赛总共进行了N次射击,产生N个成绩分数(2<=N<=100);
输入第二行,一个长度为N整数序列,表示参与每次射击的选手ID(0<=ID<=99);
输入第三行,一个长度为N整数序列,表示参与每次射击的选手对应的成绩(0<=成绩<=100)。

三、输出描述

符合题设条件的降序排名后的选手ID序列。

四、解题思路

  1. 第一行输入选手人数;
  2. 第二行输入选手ID;
  3. 第三行输入选手所得分数;
  4. 定义listMap,key:选手ID,value:每个选手的分数列表;
  5. 定义map,key:选手ID,value:每个选手最高的3个分数之和;
    • 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手;
    • 对每个选手的分数进行降序排序;
    • 计算每个选手最高的3个分数之和;
  6. 按照每个选手最高的3个分数之和降序排序,如果分数相等,按选手ID序列降序排序,否则先按分数降序排序;
  7. 输出降序排名后的选手ID序列。

五、Java算法源码

java">public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    int n = Integer.valueOf(sc.nextLine());
    // 选手
    int[] playerArr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
    // 分数
    int[] scoreArr = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();

    // key:选手ID,value:每个选手的分数列表
    Map<Integer, List<Integer>> listMap = new HashMap<>();
    for (int i = 0; i < n; i++) {
        int player = playerArr[i];
        int score = scoreArr[i];
        List<Integer> scoreList = listMap.getOrDefault(player, new ArrayList<>());
        scoreList.add(score);
        listMap.put(player, scoreList);
    }

    // key:选手ID,value:每个选手最高的3个分数之和
    Map<Integer, Integer> map = new HashMap<>();
    // 计算每个选手最高的3个分数之和
    for (Map.Entry<Integer, List<Integer>> entry : listMap.entrySet()) {
        List<Integer> scoreList = entry.getValue();
        // 如果一个选手成绩少于3个,则认为选手的所有成绩无效,排名忽略该选手
        if (scoreList.size() < 3) {
            continue;
        }

        // 对每个选手的分数进行降序排序
        Collections.sort(scoreList, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;
            }
        });

        // 计算每个选手最高的3个分数之和
        int sum = 0;
        for (int i = 0; i < 3; i++) {
            sum += scoreList.get(i);
        }
        map.put(entry.getKey(), sum);
    }

    // 按照每个选手最高的3个分数之和降序排序,如果分数相等,按选手ID序列降序排序,否则先按分数降序排序
    List<Map.Entry<Integer, Integer>> mapList = new ArrayList<Map.Entry<Integer, Integer>>(map.entrySet());
    Collections.sort(mapList, new Comparator<Map.Entry<Integer, Integer>>() {
        public int compare(Map.Entry<Integer, Integer> o1, Map.Entry<Integer, Integer> o2) {
            if (o1.getValue().equals(o2.getValue())) {
                return o2.getKey().compareTo(o1.getKey());
            } else {
                return o2.getValue().compareTo(o1.getValue());
            }
        }
    });

    // 输出降序排名后的选手ID序列
    StringBuilder builder = new StringBuilder();
    for (int i = 0; i < mapList.size(); i++) {
        builder.append(mapList.get(i).getKey()).append(",");
    }
    System.out.println(builder.deleteCharAt(builder.length() - 1));
}

六、效果展示

1、输入

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

2、输出

5,3,7,4

3、说明

(1)统计每名选手分数

  • 3号:53,80,55
  • 7号:68,16,100
  • 4号:24,39,76,66
  • 5号:53,80,55

(2)计算每个选手最高的3个分数之和

  • 3号:53,80,55 – 188
  • 7号:68,16,100 – 184
  • 4号:24,39,76,66 – 181
  • 5号:53,80,55 – 188

(3)如果分数相等,按选手ID序列降序排序,否则先按分数降序排序

5号 – 188
3号 – 188
7号 – 184
4号 – 181

在这里插入图片描述


🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述


http://www.niftyadmin.cn/n/5140833.html

相关文章

解决VSCode使用SSH远程连接时无法指定用户名的问题

Windows 11自带OpenSSH客户端&#xff0c;和VSCode配合得很好&#xff0c;没有这个问题。 今天要说的是旧版本Windows 7/8/10系统遇到的问题。 PS: Windows 7可以运行的最后版本是VSCode 1.80.2 由于Windows 7/8/10没有自带的OpenSSH客户端&#xff0c;但可以调用MSYS环境下的…

一文搞懂Dockerfile

Dockerfile Dockerfile是什么&#xff1f;Dockerfile文件说明执行顺序格式文件命名 Dockerfile常用指令FROMMAINTAINERRUNADDCOPYWORKDIRCMDENTRYPOINTENVUSERVOLUMEEXPOSE 构建镜像 Dockerfile是什么&#xff1f; Dockerfile 是一个用来构建镜像的文本文件&#xff0c;文本内…

海豚调度(dolphinsheduler)离线安装

1. 简介 1.1 DolphinScheduler 是什么 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过程的解决方案。 Apache DolphinScheduler 旨在解决复杂的大数据任务依赖关系…

Web渗透Java初学者文章汇总

Java框架可以变,基础不会变。 Java 是一门高级编程语言,由 Sun Microsystems(后来被 Oracle 收购)所开发,于 1995 年首次发布。Java 的设计目标是“一次编写,到处运行”(Write Once, Run Anywhere),也被称为 WORA。这意味着可以在不同的操作系统和硬件平台上运行同样…

Delegate的使用

新建一个Delegate类继承自QStyledItemDelegate&#xff1a; #ifndef QWINTSPINDELEGATE_H #define QWINTSPINDELEGATE_H//#include <QObject> //#include <QWidget> #include <QStyledItemDelegate>class QWIntSpinDelegate : public QStyledItemD…

PCA的原理及实现方法

参考&#xff1a; 主成分分析&#xff08;PCA&#xff09;及葡萄酒数据集示例代码

uniapp leven系列原生插件(1)

目录 1.乐橙摄像机播放插件(云台对讲版) 插件介绍 插件地址 预览图片 ​编辑 2.乐橙摄像机播放插件(子账号云台对讲版) 插件介绍 插件地址 预览图片 ​编辑 3.无预览静默拍照 插件介绍 插件地址 预览图片 4.视频图片选择安卓原生插件 插件介绍 插件地址 预览图…

Lambda lambda表达式 算法题 不死神兔 猴子吃桃 爬楼梯

目录 Lambdalambda表达式标准格式 总结lambda进阶省略写法练习算法题不死神兔猴子吃桃爬楼梯 Lambda 最直观的作用就是简化匿名内部类的写法如上 public static void main(String[] args) {Integer arr[]{2,1,4,6,3,5,8,7,9};Arrays.sort(arr, (Integer o1, Integer o2)-> {…