华为OD机试 - 生日礼物 - 二分查找(Java 2023 B卷 100分)

news2025/1/20 20:10:13

在这里插入图片描述

目录

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

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

一、题目描述

小牛的孩子生日快要到了,他打算给孩子买蛋糕和小礼物,蛋糕和小礼物各买一个,他的预算不超过x元。蛋糕cake和小礼物gift都有多种价位的可供选择。

请返回小牛共有多少种购买方案。

二、输入描述

  • 第一行表示cake的单价,以逗号分隔
  • 第二行表示gift的单价,以逗号分隔
  • 第三行表示X预算

三、输出描述

输出数字表示购买方案的总数。

备注:

1 < cake.length <= 105
1 < gift.length <= 105
1 < cake[i],gift[i] <= 105
1 < X <= 2 * 105

四、解题思路

这道题题意很简单,就是第一行选一个数、第二行选一个数,两数之和小于第三行的数,统计一下有多少种组合。

  1. 输入蛋糕cakes;
  2. 输入小礼物gifts;
  3. 输入预算X;
  4. 对礼物gifts进行升序排序;
  5. 遍历蛋糕集合cakes;
  6. 遍历礼物集合gifts,二分查找, 找到最大的满足位置;
  7. 返回的最大满足位置 + 1(因为下角标从0开始) = 在购买当前蛋糕时,可以买多少种小礼物;
  8. 输出数字表示购买方案的总数。

五、Java算法源码

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 蛋糕cakes
    int[] cakes = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
    // 小礼物gifts
    int[] gifts = Arrays.stream(sc.nextLine().split(",")).mapToInt(Integer::parseInt).toArray();
    // 预算
    int X = Integer.parseInt(sc.nextLine());

    // 对礼物gifts进行升序排序
    Arrays.sort(gifts);

    // 一共多少种购买方式
    int buyMethodSum = 0;
    // 遍历蛋糕集合cakes
    for (int cake : cakes) {
        if (X <= cake) {
            continue;
        }

        // 找到最大的满足位置
        int max = searchLast(gifts, X - cake);

        if (max >= 0) {
            // 返回的最大满足位置 + 1(因为下角标从0开始) = 在购买当前蛋糕时,可以买多少种小礼物
            buyMethodSum += max + 1;
        } else {
            max = -max - 1;
            buyMethodSum += max;
        }
    }

    System.out.println(buyMethodSum);
}

/**
 * 遍历礼物集合gifts,二分查找, 找到最大的满足位置
 *
 * @param gifts 礼物集合
 * @param target 预算 - 蛋糕
 * @return 最大的满足位置
 */
public static int searchLast(int[] gifts, int target) {
    int left = 0;
    int right = gifts.length - 1;

    while (left <= right) {
        // 二分查找
        int mid = (left + right) >> 1;

        // 如果中间数 大于 剩余预算
        if (gifts[mid] > target) {
            right = mid - 1;
        } else if (gifts[mid] < target) {// 如果中间数 小于 剩余预算
            left = mid + 1;
        } else {// 如果中间数 等于 剩余预算
            /**
             * 如果中间位置最后一个(遍历光了)
             * 或者
             * 中间位置的数 不等于 中间位置的下一个数(因为要求找到最大的满足位置,挨着的数不相等,相等的话要取下一个位置)
             * 直接返回mid位置
             */
            if (mid == gifts.length - 1 || gifts[mid] != gifts[mid + 1]) {
                return mid;
            } else {//否则继续向右二分查找
                left = mid + 1;
            }
        }
    }

    return -left - 1;
}

六、效果展示

1、输入

10,15,20
5,7,9
25

2、输出

7

3、说明

这道题题意很简单,就是第一行选一个数、第二行选一个数,两数之和小于第三行的数,统计一下有多少种组合。

  1. 遍历10,15,20;
  2. 先通过25-10 = 15,找到最大的满足位置2;
  3. 位置2表示都满足,故蛋糕为10时,三个礼物都可以买+3;
  4. 当蛋糕为15时,找到最大的满足位置2,三个礼物都可以买+3;
  5. 当蛋糕为20时,找到最大的满足位置0,只能买价值为5的礼物,+1;
  6. 输出购买方案的总数7;

在这里插入图片描述


🏆下一篇:华为OD机试真题 Java 实现【路灯照明问题】【2022Q4 100分】,感谢fly晨发现这个问题,并提供更优质的算法

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

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951117.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

100天精通Golang(基础入门篇)——第19天:深入剖析Go语言中方法(Method)的妙用与实践

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to Golang Language.✨✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1…

Python2022年09月Python二级 -- 编程题解析

第一题: 某航空公司对于托运行李有尺寸要求&#xff0c;必须满足以下条件:每件托运行李的长、宽、高三边之和须大于或等于60厘米&#xff0c;且小于或等于203厘米。(注意只是三边&#xff0c;不考虑立方体的整个周长&#xff0c;相当于只求长宽高三个数字的和&#xff0c;如&am…

Mysql的page,索引,Explain Type等基本常识

Mysql的基本问题 Mysql 为什么建议使用自增id&#xff1f; 因为id&#xff08;主键&#xff09;是自增的话&#xff0c;那么在有序的保存用户数据到页中的时候&#xff0c;可以天然的保存&#xff0c;并且是在聚集索引&#xff08;id&#xff09;中的叶子节点可以很好的减少插…

STM32H750+LAN8720无操作系统移植lwip

前言 本文提供移植好的工程&#xff0c;见本文绑定资源 环境 STM32CubeMX&#xff1a; V6.8.1 STM32H7 HAL Pack&#xff1a; V1.11.1 硬件连接 STM32H750 GPIO定义如下&#xff1a; LAN8720 GPIO定义如下&#xff1a; 连接方式如下&#xff1a; LAN8720       <—…

翻斗式雨量计入选【2023年济南市重点工业新产品】名单

近日&#xff0c;济南市工业和信息化局发布了【2023年济南市重点工业新产品】名单&#xff0c;山东仁科测控技术有限公司“翻斗式雨量计”成功入选。 为深入实施工业强市战略&#xff0c;切实加强创新示范推广与应用&#xff0c;鼓励企业研发新技术、新产品、新工艺&#xff0…

Android Native Code开发学习(三)对java中的对象变量进行操作

Android Native Code开发学习&#xff08;三&#xff09; 本教程为native code学习笔记&#xff0c;希望能够帮到有需要的人 我的电脑系统为ubuntu 22.04&#xff0c;当然windows也是可以的&#xff0c;区别不大 对java中的对象变量进行操作 首先我们新建一个java的类 pub…

全画面塑料激光透光率测试仪

随着光学塑料成型技术的不断发展&#xff0c;光学塑料透镜在各类光学系统中得到了广泛的应用。光学塑料具有便于大批量生产&#xff0c;设计灵活性高&#xff0c;重量轻和耐冲击等特点。最近几年来&#xff0c;国内外有许多专家学者对热塑性半结晶塑料激光焊接工艺上的应用进行…

Java入门第四节

Java入门第四节 一.继承 问题&#xff1a; 隔壁的王阿姨养了一只猫和一只仓鼠&#xff0c;也想使用这个app&#xff0c;应该这么办 解决&#xff1a; 1.找出所有动物的共性(如.有名字&#xff0c;品种&#xff0c;年龄&#xff0c;吃饭&#xff0c;跑等等)&#xff0c;创建…

IDEA工具栏快捷按钮

如图 点击快速弹出创建class. 主要我9.9的鼠标右键不灵敏 方法 在工具栏右键 横杠出点 Add Action 没有横杠就点下一个

QLabel控件使用

Qt为我们应用程序界面开发提供的一系列的控件&#xff0c;下面我们介绍两种最常用一些控件&#xff0c;所有控件的使用方法我们都可以通过帮助文档获取。 1.QLabel控件使用 QLabel是我们最常用的控件之一&#xff0c;其功能很强大&#xff0c;我们可以用来显示文本&#xff0c…

0830hw

1.2.链式队列 head.h #include <myhead.h> typedef int datatype; typedef struct seq {union{datatype data;int len;};struct seq *next; }seq,*S; typedef struct PP {S front;S rear; }P; P *create(); void input_tail(P *p,datatype n); void pop_head(P *p); vo…

Python程序化交易接口批量获取数据源码

小编举例下面是一个简单的示例代码&#xff0c;展示如何使用Python的程序化交易接口批量获取数据&#xff0c;例如开发文档参考&#xff1a;MetaTradeAPI (metatradeapi) - Gitee.com 签名 int Init(); 功能 API 初始化 参数 无 返回值 授权成功的交易账户数量 返回值 &…

使用STM32与TB6612FNG驱动直流减速电机

TB6612FNG介绍 单片机引脚的电流一般只有几十个毫安&#xff0c;无法驱动电机&#xff0c;因此一般是通过单片机控制电机驱动芯片进而控制电机。TB6612是比较常用的电机驱动芯片之一。 TB6612FNG可以同时控制两个电机&#xff0c;工作电流1.2A&#xff0c;最大电流3.2A。 AIN…

Java里面对int[]数组做新增删除去重实现

Java里面对int[]数组做新增删除去重实现 说明代码根据索引删除数组中的某个数据实现在数组中添加一个元素实现删除数组里面的重复数据去掉数组里面的重复数据&#xff0c;只保留一个 说明 这里记录下使用int[]数组对数组进行新增删除去重等操作&#xff0c;用来更加了解java里…

部署单点elasticsearch

部署elasticsearch 创建网络 因为我们还需要部署kibana容器&#xff0c;因此需要让es和kibana容器互联。这里先创建一个网络 docker network create es-net 拉取镜像 我们采用elasticsearch的7.12.1版本的镜像 docker pull elasticsearch:7.12.1 运行 运行docker命令&a…

编译KArchive在windows10下

使用QT6和VS2019编译KArchive的简要步骤&#xff1a; 安装 Qt &#xff0c;我是用源码自己编译的 "F:\qtbuild"安装CMakefile并配置环境变量安装Git下载ECM源码 https://github.com/KDE/extra-cmake-modules.git-------------------------------------------------…

springboot docker

在Spring Boot中使用Docker可以帮助你将应用程序与其依赖的容器化&#xff0c;并简化部署和管理过程。 当你在Spring Boot中使用Docker时&#xff0c;你的代码不需要特殊的更改。你可以按照通常的方式编写Spring Boot应用程序。 java示例代码&#xff0c;展示了如何编写一个基…

如何飞速成为开源贡献者(Contributor)

如何飞速成为开源贡献者Contributor 一、环境信息1.1 硬件信息1.2 软件信息 二、Git安装2.1 Git介绍2.2 Git下载安装 三、开源项目选定四、GitHub参与开源流程4.1 Fork项目4.2 SSH配置4.2.1 为什么要配置SSH4.2.2 如何配置SSH 4.3 Clone项目4.4 IDEA关联4.5 PR生成4.6 PR提交 一…

电脑突然提示msvcr120.dll错误的解决方法,最全面的解决方法

今天&#xff0c;我将和大家分享一种常见的电脑问题——电脑突然提示msvcr120.dll错误的解决方法。希望通过这次演讲&#xff0c;能够帮助大家解决这个问题&#xff0c;提高大家的电脑使用效率。首先&#xff0c;让我们来了解一下msvcr120.dll是什么。msvcr120.dll是Microsoft …

CMH检验

前言 CMH检验&#xff08;Cochran-Mantel-Haenszel Test&#xff09;&#xff0c;分层卡方检验&#xff0c;考虑中心效应&#xff0c;分析干预对结果的影响。如果存在中心效应&#xff0c;即干预结果与中心相关&#xff0c;那么简单的将中心数据合并做卡方分析并不合理。需要采…