孙悟空吃蟠桃 - 华为OD统一考试

news/2024/7/20 19:52:36 标签: 华为od, 算法, java, python, c++, 面试, 机试

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

孙悟空爱吃蟠桃,有一天趁着蟠桃园守卫不在来偷吃。已知蟠桃园有 N 棵蟠桃树,每棵树上都桃子,守卫将在 H 小时后回来。

孙悟空可以决定他吃蟠桃的速度 K (个/每小时),每个小时选一棵桃树,并从树上吃掉 K 个,如果K大于该树上所有桃子个数,则全部吃掉,并且这一小时剩余的时间里不再吃桃。

孙悟空喜欢慢慢吃,但又想在守卫回来前吃完桃子。

请返回孙悟空可以在 H 小时内吃掉所有桃子的最小速度 KK 为整数)。如果以任何速度都吃不完所有桃子,则返回 0。

输入描述

第一行输入为 N个数字, N 表示桃树的数量,这 N 个数字表示每棵桃树上蟠桃的数量。

第二行输入为一个数字,表示守卫离开的时间 H

其中数字通过空格分割, NH 为正整数,每棵树上都有蟠桃,且 0<N<10000, 0 < H < 10000。

输出描述

输出吃掉所有蟠桃的最小速度 K,无解或输入异常时输出 0。

示例1

输入:
2 3 4 5
4

输出:
5

示例2

输入:
2 3 4 5
3

输出:
0

示例3

输入:
30 11 23 4 20
6

输出:
23

题解

结合以上的题目和以下题目代码解法总结一些题解信息。

从以下几点方面: 题目属于什么类型的算法题(例如,动态规划、DFS、BFS、贪心、双指针 …),解题思路,代码大致描述,时间复杂度,空间复杂度,及同类型 leetcode.cn 的题目

Java

java">import java.util.Arrays;
import java.util.Scanner;

/**
 * @author code5bug
 */
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 每棵桃树上蟠桃的数量
        int[] peachs = Arrays.stream(scanner.nextLine().split(" "))
                .mapToInt(Integer::parseInt).toArray();

        // 守卫离开的时间
        int H = scanner.nextInt();

        System.out.println(solve(peachs, H));
    }

    /**
     * 每个小时只能选一棵桃树,能否在 H 小时内吃完所有的桃子
     *
     * @param peachs 每棵桃树上蟠桃的数量
     * @param speed  守卫每小时吃的桃子数量
     * @param H      守卫离开的时间
     * @return 每个小时只能选一棵桃树,能否在 H 小时内吃完所有的桃子
     */
    private static boolean ok(int[] peachs, int speed, int H) {
        int time = 0;
        for (int cnt : peachs) {
            time += (cnt + speed - 1) / speed;  // 向上取整
        }
        return time <= H;
    }

    /**
     * 计算守卫在 H 小时内能吃完所有的桃子的最小速度
     *
     * @param peachs 每棵桃树上蟠桃的数量
     * @param H      守卫离开的时间
     * @return 守卫在 H 小时内能吃完所有的桃子的最小速度
     */
    private static int solve(int[] peachs, int H) {
        int n = peachs.length;

        // 每个小时只能选一棵桃树,因此任何速度都吃不完所有桃子
        if (n > H) {
            return 0;
        }

        int l = 0, r = Arrays.stream(peachs).max().orElse(0);
        while (l + 1 < r) {
            int mid = (l + r) / 2;
            if (ok(peachs, mid, H)) {
                r = mid;
            } else {
                l = mid;
            }
        }
        return r;
    }
}

Python

python">from typing import List


def ok(peachs: List[int], speed: int, H: int) -> bool:
    """
    :param peachs: 每棵桃树上蟠桃的数量
    :param speed: 守卫每小时吃的桃子数量
    :param H: 守卫离开的时间
    :return:  每个小时只能选一棵桃树,能否在 H 小时内吃完所有的桃子
    """
    time = 0
    for cnt in peachs:
        time += (cnt + speed - 1) // speed  # 向上取整

    return time <= H


def solve(peachs: List[int], H: int) -> int:
    n = len(peachs)

    # 每个小时只能选一棵桃树,因此任何速度都吃不完所有桃子
    if n > H:
        return 0

    l, r = 0, max(peachs)
    while l + 1 < r:
        mid = (l + r) // 2
        if ok(peachs, mid, H):
            r = mid
        else:
            l = mid
    return r


if __name__ == '__main__':
    # 每棵桃树上蟠桃的数量
    peachs = list(map(int, input().split()))

    # 守卫离开的时间
    H = int(input())

    print(solve(peachs, H))

C++

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

/**
 * 每个小时只能选一棵桃树,能否在 H 小时内吃完所有的桃子
 *
 * @param peachs 每棵桃树上蟠桃的数量
 * @param speed  守卫每小时吃的桃子数量
 * @param H      守卫离开的时间
 * @return 每个小时只能选一棵桃树,能否在 H 小时内吃完所有的桃子
 */
bool ok(const vector<int>& peachs, int speed, int H) {
    int time = 0;
    for (int cnt : peachs) {
        time += (cnt + speed - 1) / speed;  // 向上取整

        if(time > H) return false;
    }
    return true;
}

/**
 * 计算守卫在 H 小时内能吃完所有的桃子的最小速度
 *
 * @param peachs 每棵桃树上蟠桃的数量
 * @param H      守卫离开的时间
 * @return 守卫在 H 小时内能吃完所有的桃子的最小速度
 */
int solve(const vector<int>& peachs, const int H) {
    int n = peachs.size();

    // 每个小时只能选一棵桃树,因此任何速度都吃不完所有桃子
    if (n > H) {
        return 0;
    }

    int l = 0, r = *max_element(peachs.begin(), peachs.end());
    while (l + 1 < r) {
        int mid = (l + r) / 2;
        if (ok(peachs, mid, H)) {
            r = mid;
        } else {
            l = mid;
        }
    }
    return r;
}

int main() {
    // 每棵桃树上蟠桃的数量
    vector<int> peachs;
    int peach;
    while (cin >> peach) {
        peachs.push_back(peach);
    }

    // 守卫离开的时间
    int H = peachs.back();
    peachs.pop_back();

    cout << solve(peachs, H) << endl;

    return 0;
}

相关练习题

题号题目难易
LeetCode 16311631. 最小体力消耗路径中等
LeetCode 22262226. 每个小孩最多能分到多少糖果中等

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏


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

相关文章

c入门第十六篇——学生成绩管理系统

师弟&#xff1a;“师兄&#xff0c;我最近构建了一个学生成绩管理系统&#xff0c;有空试用一下么&#xff1f;” 我&#xff1a;“好啊&#xff01;” 一个简单的学生成绩管理系统&#xff0c;基本功能包括&#xff1a;添加学生信息、显示所有学生信息、按学号查找学生信息、…

MySQL(基础)

第01章_数据库概述 1. 为什么要使用数据库 持久化(persistence)&#xff1a;把数据保存到可掉电式存储设备中以供之后使用。大多数情况下&#xff0c;特别是企业级应用&#xff0c;数据持久化意味着将内存中的数据保存到硬盘上加以”固化”&#xff0c;而持久化的实现过程大多…

dp进阶之路——最后一块石头的重量

1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结果…

Javaweb之SpringBootWeb案例之propagation属性案例演示的详细解析

案例 接下来我们就通过一个案例来演示下事务传播行为propagation属性的使用。 需求&#xff1a;解散部门时需要记录操作日志 由于解散部门是一个非常重要而且非常危险的操作&#xff0c;所以在业务当中要求每一次执行解散部门的操作都需要留下痕迹&#xff0c;就是要记录操作…

福布斯2023年推荐:十佳项目管理软件榜单揭晓

项目管理软件可以轻松规划项目、分配任务并保持团队井井有条&#xff0c;以便满足截止日期和目标。然而当今市场上有如此多的项目管理系统&#xff0c;选择适合您需求的正确选项可能很困难。为了提供帮助&#xff0c;福布斯小型企业顾问团队分析了数十家领先的提供商&#xff0…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(九)(3)

实验九&#xff1a;线性函数极值求解 练习三 1.设有三种证券 期望收益率分别为10%,15%和40%,风险分别是10%,5%和20%,假定投资总风险用最大一种投资股票的风险来度量,且同期银行存款利率为 5%,无风险,为投资者建议一种投资策略(投资比例),使其尽可能获得最大收益. clc;clear;…

react渲染流程是怎样的

整体流程&#xff1a; react的核心可以用uifn(state)来表示&#xff0c;更详细可以用&#xff1a; const state reconcile(update); const UI commit(state);上面的fn可以分为如下一个部分&#xff1a; Scheduler&#xff08;调度器&#xff09;&#xff1a; 调度任务&…

RBF神经网络中的RBF的英文全称是什么,是用来干什么的?

问题描述&#xff1a;RBF神经网络中的RBF的英文全称是什么&#xff0c;是用来干什么的&#xff1f; 问题解答&#xff1a; RBF神经网络中的RBF是径向基函数&#xff08;Radial Basis Function&#xff09;的缩写。径向基函数是一种在机器学习和模式识别中常用的函数类型&…