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

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

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

from typing import Listdef ok(peachs: List[int], speed: int, H: int) -> bool:""":param peachs: 每棵桃树上蟠桃的数量:param speed: 守卫每小时吃的桃子数量:param H: 守卫离开的时间:return:  每个小时只能选一棵桃树,能否在 H 小时内吃完所有的桃子"""time = 0for cnt in peachs:time += (cnt + speed - 1) // speed  # 向上取整return time <= Hdef solve(peachs: List[int], H: int) -> int:n = len(peachs)# 每个小时只能选一棵桃树,因此任何速度都吃不完所有桃子if n > H:return 0l, r = 0, max(peachs)while l + 1 < r:mid = (l + r) // 2if ok(peachs, mid, H):r = midelse:l = midreturn rif __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.mzph.cn/news/681808.shtml

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

相关文章

华为数通方向HCIP-DataCom H12-821题库(单选题:441-460)

第441题 下面是一台路由输出的信息,关于这段信息描述正确的是 <R1>display bgp peerBGP local router ID : 2.2.2.2Local AS number : 100Total number of peers : 2 Peers in established state : 0Peer V AS MsgRcvd MsgSent OutQ Up/Down …

Mysql基本函数

系统函数 version()--mysql版本 user()--数据库用户名 database()--数据库名 datadir--数据库路径 version_compile_os--操作系统版本 hostname--当前机器的机器名 Schema()——当前数据库 字符串连接函数 concat(str1,str2,…)--没有分隔符地连接字符串 concat_ws(separator…

Java:什么是向上转型与向下转型(详细图解)

目录 一、什么是向上转型 1、概念 2、代码示例 3、向上转型的优缺点 二、什么是向下转型 1、向下转型的概念 ​编辑 2、代码示例 三、向下转型的缺点及 instanceof 的使用 1、向下转型的缺点 2、instanceof的使用 一、什么是向上转型 1、概念 向上转型就是创建一个…

Java并发基础:PriorityBlockingQueue全面解析!

内容概要 PriorityBlockingQueue类能高效处理优先级任务&#xff0c;确保高优先级任务优先执行&#xff0c;它内部基于优先级堆实现&#xff0c;保证了元素的有序性&#xff0c;同时&#xff0c;作为BlockingQueue接口的实现&#xff0c;它提供了线程安全的队列操作&#xff0…

人类知识的分类

根据休谟的理论&#xff0c;人类知识可以分为两个范畴&#xff1a;先验范畴和经验范畴。 先验范畴指的是那些不依赖于经验或感官观察而能够获得的知识。这些知识是基于我们的理性和思维能力而得出的&#xff0c;它们不需要通过直接观察或实验来验证。休谟认为&#xff0c;先验范…

C/C++内存管理:new、delete功能及原理实现

目录 一、C/C内存分布 二、C中内存管理方式 2.1new/delete操作内置类型 2.2 new和delete操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 4.1内置类型 4.2自定义类型 五、定位new 一、C/C内存分布 int globalVar 1; static int sta…

阅读 - 搭建博客

搭建博客的几种方式 1. 使用在线的博客系统&#xff0c;如语雀、掘金、CSDN等。 优点&#xff1a;直接创建账号使用即可&#xff0c;简单方便&#xff0c;不需要维护 缺点&#xff1a;文章分散在各个平台&#xff0c;不易于管理 2. github pages hugo、hexo等静态博客系统…

springboot/ssm学生信息管理系统Java学生在线选课考试管理系统

springboot/ssm学生信息管理系统Java学生在线选课考试管理系统 开发语言&#xff1a;Java 框架&#xff1a;springboot&#xff08;可改ssm&#xff09; vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服务器&#xff1a;tomcat 数据库&#xff1a;mysql 5.…

【docker 的常用命令——详细讲解】

docker 的常用命令 1. 介绍2. 基本管理命令3. 文件和数据传输4. Docker Compose 命令&#xff08;用于多容器应用&#xff09; 1. 介绍 Docker 是一个开源的应用容器引擎&#xff0c;它允许开发者打包他们的应用程序及依赖包到一个可移植的容器中&#xff0c;然后发布到任何流…

MATLAB知识点:fibonacci函数(★☆☆☆☆)返回斐波那契数列

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章&#xff1a;课后习题讲解中拓展的函数 在讲解第…

javaScript实现客户端直连AWS S3(亚马逊云)文件上传、断点续传、断网重传

写在前面&#xff1a;在做这个调研时我遇到的需求是前端直接对接亚马逊平台实现文件上传功能。上传视频文件通常十几个G、客户工作环境网络较差KB/s&#xff0c;且保证上传是稳定的&#xff0c;支持网络异常断点重试、文件断开支持二次拖入自动重传等。综合考虑使用的Aws S3的分…

01 前言

目录 什么是CC发展史C的重要性如何学习C关于本专栏 1. 什么是c C语言是结构化和模块化的语言&#xff0c;适合处理较小规模的程序。对于复杂的问题&#xff0c;规模较大的程序&#xff0c;需要高度的抽象和建模时&#xff0c;C语言则不合适。为了解决软件危机&#xff0c; 20…

java实现多级目录树(递归实现)

一.应用场景 有时候需要我们后台给前台传树结构的数据&#xff0c;要怎么查询? 怎么返回数据呢&#xff1f; 二.数据库表设计以及数据内容(以部门举例) id 主键 parent_id 父级部门id depart_name 部门名词 sort 部门排序三.实体类 Data public…

线性判别分析(LDA)

一、说明 LDA 是一种监督降维和分类技术。其主要目的是查找最能分隔数据集中两个或多个类的特征的线性组合。LDA 的主要目标是找到一个较低维度的子空间&#xff0c;该子空间可以最大限度地区分不同类别&#xff0c;同时保留与歧视相关的信息。 LDA 是受监督的&#xff0c;这意…

【Linux】线程概念和线程控制

线程概念 一、理解线程1. Linux中的线程2. 重新定义线程和进程3. 进程地址空间之页表4. 线程和进程切换5. 线程的优点6. 线程的缺点7. 线程异常8. 线程用途9. 线程和进程 二、线程控制1. pthread 线程库&#xff08;1&#xff09;pthread_create()&#xff08;2&#xff09;pth…

哈夫曼树的学习以及实践

哈夫曼树 哈夫曼树的基本了解哈夫曼树的基本概念创建霍夫曼树的思路编码构建的思路代码实现创建HuffmanTree结点初始化HuffmanTree创建霍夫曼树霍夫曼树编码 哈夫曼树的基本了解 给定 n 个 权值 作为 n 个 叶子节点&#xff0c;构造一颗二叉树&#xff0c;若该树的 带权路径长…

UDP报文结构和注意事项

udp由报头和载荷组成&#xff0c;报头由四部分组成 源端口 目的端口 udp长度 检验和&#xff0c;每部分由两个字节组成。 源端口和目的端口分别表示发送方和接收方的位置 udp长度表示了该数据报的大小&#xff0c;一个udp数据报为64kb 检验和用来检验所得到的数据是否正确。…

LeetCode:83和82.删除排序链表中的重复元素I,II

这两题算是链表的基础题&#xff0c;就遍历删除没啥特点&#xff0c; 83甚至不需要考虑第一个结点的特殊情况&#xff0c;属实是名副其实的easy了 LeetCode&#xff1a;21.合并两个有序链表之第一次的特殊情况-CSDN博客 83. 删除排序链表中的重复元素 - 力扣&#xff08;Lee…

TeamCity创建git项目Timed out 超时的一个解决办法

问题&#xff1a; 当自己&#xff1a; ping github.com从本地推送到远程仓库浏览器浏览www.github.com ——都没有问题 但是在teamcity创建工程的时候就超时&#xff1a; 或者多试几次&#xff0c;终于成功了&#xff0c;然后构建的时候半途超时报错。。。。。 一种解决办…

Vue3快速上手(四)ref之基本类型响应式数据

一、ref之基本类型响应式数据 1.1 基本语法 import { ref } from vuelet x ref(初始值)console.log(xxx --> , x.value);x为一个RefImpl对象&#xff0c;该对象的value属性为实际值&#xff0c;在script里需要操作x.value来改变数据的值&#xff0c;在页面里则可以直接使…