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

news/2024/7/20 19:31:12 标签: 华为od, java, python, 二分查找

在这里插入图片描述

目录

    • 一、题目描述
    • 二、输入描述
    • 三、输出描述
    • 四、解题思路
    • 五、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算法源码

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.niftyadmin.cn/n/4985231.html

相关文章

结算日-洛谷

结算日 - 洛谷 解释&#xff1a; 1.用sum记录贝西走到某位置的累计的总钱&#xff0c;flag标记是否有欠债还不了的情况&#xff08;1为有&#xff09;&#xff0c;ans记录步数。 2.若sum<0&#xff0c;则欠债无法还&#xff0c;flag标记为1&#xff0c;并记录下此刻的位置…

【学习笔记】【DOA子空间算法】7 MUSIC-like 算法

【学习笔记】【DOA子空间算法】7 MUSIC-like 算法 7 MUSIC-like 算法7.1 算法原理7.1.1 关于四阶累积量矩阵网上流传错误版本的一些讨论7.1.2 关于细节的一些讨论 7.2 算法步骤7.3 代码实现7.4 参考内容 7 MUSIC-like 算法 在学习 MUSIC-like 算法之前需要理解四阶累积量、Kron…

人体学接口设备 (HID)

参考链接 windows-hardware drivers hid | Microsoft Learnhttps://learn.microsoft.com/pdf?urlhttps%3A%2F%2Flearn.microsoft.com%2Fzh-cn%2Fwindows-hardware%2Fdrivers%2Fhid%2Ftoc.json人体学接口设备 (HID) 简介 - Windows drivers | Microsoft Learnhttps://learn.mi…

VMware vCenter Server 7.0.3 安装

VMware vCenter Server 7.0.3 安装 文章目录 VMware vCenter Server 7.0.3 安装1. 安装 vcenter1.1 第一阶段1.2 第二阶段 2. exsi 查看 vcenter3. 部署 DNS server3.1 安装 unbound3.2 配置 unbound3.3 vcenter 配置域名访问 1. 安装 vcenter 1.1 第一阶段 双击 192.168.2…

【Go 基础篇】走进Go语言的面向对象编程世界

欢迎各位编程爱好者们&#xff01;今天我们将进入Go语言的面向对象编程&#xff08;OOP&#xff09;世界&#xff0c;一窥这门语言如何运用OOP思想来组织和构建程序。无论你是初学者还是有一些经验的开发者&#xff0c;本文都将为你揭示Go语言中的OOP特性、方法和最佳实践。 O…

【AGC】集成APMS SDK后台无数据问题

【问题描述】 开发者按照文档集成了APMS SDK&#xff0c;但是在AGC后台没有数据&#xff0c;需要帮忙定位。 【问题分析】 后台没有性能数据的原因有很多&#xff0c;要从端侧和与云侧进行定位分析。 1. 首先需要查看端侧的调试日志&#xff0c;调试日志可以直观的看到性…

PAT 1145 Hashing - Average Search Time

个人学习记录&#xff0c;代码难免不尽人意。 The task of this problem is simple: insert a sequence of distinct positive integers into a hash table first. Then try to find another sequence of integer keys from the table and output the average search time (the…

使用C语言中犯过的错误(持续更新)

1.连续定义 在连续定义的时候有的时候很容易出错&#xff0c;因此除非必要&#xff0c;个人认为最好采取分开定义的方案。 1.使用宏发生错误 #define TYPE char* TYPE a, b; //由于宏只是简单的文本替换机制&#xff0c;a的类型是char*&#xff0c;但是b的类型是char&#x…