【九十二】【算法分析与设计】875. 爱吃香蕉的珂珂,410. 分割数组的最大值,机器人跳跃问题,二分答案法

875. 爱吃香蕉的珂珂 - 力扣(LeetCode)

珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。

珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。

珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 h 小时内吃掉所有香蕉的最小速度 kk 为整数)。

示例 1:

输入:piles = [3,6,7,11], h = 8 输出:4

示例 2:

输入:piles = [30,11,23,4,20], h = 5 输出:30

示例 3:

输入:piles = [30,11,23,4,20], h = 6 输出:23

提示:

  • 1 <= piles.length <= 10(4)

  • piles.length <= h <= 10(9)

  • 1 <= piles[i] <= 10(9)

 
class Solution {
public:using ll = long long;  // 定义长整型别名vector<int> piles;     // 存储香蕉堆的数组int h;                 // 总时间 h 小时int n;                 // 香蕉堆的数量ll ret = INT_MAX;      // 存储结果,即最小速度 kll maxp;               // 存储最大的香蕉堆数量// 计算在给定速度下吃完所有香蕉所需的总时间ll f(ll speed) {ll count = 0;  // 总时间for (int i = 0; i < n; i++) {// 计算吃完当前堆香蕉所需的时间count += piles[i] % speed == 0 ? piles[i] / speed : piles[i] / speed + 1;}return count;  // 返回总时间}// 初始化函数,计算香蕉堆的数量和最大的香蕉堆数量void init() {n = piles.size();  // 计算香蕉堆的数量for (int i = 0; i < n; i++) {maxp = fmax(maxp, piles[i]);  // 找到最大的香蕉堆数量}}// 二分查找解决问题void solve() {int l = 1, r = maxp;  // 定义二分查找的左右边界while (!(l > r)) {    // 当左边界不大于右边界时int mid = (l + r) >> 1;  // 计算中间值if (f(mid) <= h) {       // 如果在当前速度下能在 h 小时内吃完所有香蕉ret = fmin(ret, mid);  // 更新最小速度r = mid - 1;           // 缩小右边界} else {l = mid + 1;           // 否则,增加左边界}}}// 主函数,计算在 h 小时内吃完所有香蕉的最小速度int minEatingSpeed(vector<int>& _piles, int _h) {ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);  // 加速输入输出piles = _piles, h = _h;  // 初始化香蕉堆和时间init();                  // 初始化solve();                 // 二分查找解决问题return ret;              // 返回结果}
};

410. 分割数组的最大值 - 力扣(LeetCode)

给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。

设计一个算法使得这 k 个子数组各自和的最大值最小。

示例 1:

输入:nums = [7,2,5,10,8], k = 2 输出:18 解释: 一共有四种方法将 nums 分割为 2 个子数组。 其中最好的方式是将其分为 [7,2,5] 和 [10,8] 。 因为此时这两个子数组各自的和的最大值为18,在所有情况中最小。

示例 2:

输入:nums = [1,2,3,4,5], k = 2 输出:9

示例 3:

输入:nums = [1,4,4], k = 3 输出:4

提示:

  • 1 <= nums.length <= 1000

  • 0 <= nums[i] <= 10(6)

  • 1 <= k <= min(50, nums.length)

1.

创建变量的时候注意赋予初值,ACM模式可能会发生错误,养成好习惯,赋初值.

2.

二分答案法,固定答案寻找符合要求的答案值.

 
class Solution {
public:/*将子数组分成k份,对于每一份子数组,求累加和的最大值.将所有情况的结果最小值求出来固定答案,如果固定答案,意味着所有子数组累加和必须小于limit.这个答案有没有效果取决于是否可以分成k个子数组.看最小可能分成几个子数组,如果最小可以分成m个,m<=k*/vector<int> nums;//存储数组,下标映射元素int k;//分成k份int ret;//结果变量int n;//数组长度int nums_max, sum;//数组元素最大值,和数组累加和int f(int limit) {int count = 0;//可能的最小的分组数int sum = 0;//当前组数的累加和int i = 0;//下一个元素下标//[0,i)//[x,i)while (!(i >= n)) {//递归的迭代写法,出口条件是 i>=n//将i位置元素加入当前组中sum += nums[i];//加入当前组中if (sum > limit) {//如果当前组不能维持累加和小于等于limit,说明此时需要新增一个组count++;//新增一个组sum = nums[i];//这个组累加和是i位置元素}i++;//进入下一个节点}count++;//最后一个组是没有记录的,所以需要++操作return count;//返回可能的最小的组数}void init() {n = nums.size();//初始化n变量,数组的元素个数for (int i = 0; i < n; i++) {nums_max = max(nums_max, nums[i]);//初始化nums_maxsum += nums[i];//初始化sum}}void solve() {int l = nums_max, r = sum;//答案的可能范围是[nums_max,sum]while (l <= r) {//二分所有可能取值int mid = (l + r) >> 1;//中点if (f(mid) <= k) {//如果中点成为答案符合条件ret = mid;//记录为答案r = mid - 1;//去左边找可能成为答案你的更小的答案} else {l = mid + 1;//去右边找}}}int splitArray(vector<int>& _nums, int _k) {nums = _nums, k = _k;init();solve();return ret;}
};

机器人跳跃问题_牛客题霸_牛客网

描述

机器人正在玩一个古老的基于DOS的游戏。游戏中有N+1座建筑——从0到N编号,从左到右排列。编号为0的建筑高度为0个单位,编号为i的建筑的高度为H(i)个单位。

起初, 机器人在编号为0的建筑处。每一步,它跳到下一个(右边)建筑。假设机器人在第k个建筑,且它现在的能量值是E, 下一步它将跳到第个k+1建筑。它将会得到或者失去正比于与H(k+1)与E之差的能量。如果 H(k+1) > E 那么机器人就失去 H(k+1) - E 的能量值,否则它将得到 E - H(k+1) 的能量值。

游戏目标是到达第个N建筑,在这个过程中,能量值不能为负数个单位。现在的问题是机器人以多少能量值开始游戏,才可以保证成功完成游戏?

输入描述:

第一行输入,表示一共有 N 组数据. 第二个是 N 个空格分隔的整数,H1, H2, H3, ..., Hn 代表建筑物的高度

输出描述:

输出一个单独的数表示完成游戏所需的最少单位的初始能量

示例1

输入:

5 3 4 3 2 4

复制

输出:

4

复制

示例2

输入:

3 4 4 4

复制

输出:

4

复制

示例3

输入:

3 1 6 4

复制

输出:

3

复制

备注:

数据约束:

1 <= N <= 10^5

1 <= H(i) <= 10^5

1.

养成好习惯,变量赋初值.

2.

代码过不去可能不是代码逻辑错误,有可能是变量在运行过程中是否越界.

power一直累加有可能会越界.

尽可能进行剪枝操作.

#include <climits>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'vector<int> arr;//数组,下标映射元素
int n;//数组大小
int nums_max;//数组元素最大值
int ret;//结果变量
bool f(int limit) {int i = 0; //[0,i)int power = limit;//当前能量值,最开始的能力值while (!(i >= n || power < 0)) {//递归的迭代写法if(power>=nums_max)return true;//剪枝操作,当能量大于数组最大值,直接返回trueint diff = abs(arr[i] - power);//计算差值if (arr[i] > power) {//如果i位置高度大于当前能量power -= diff;//能量减少} else {power += diff;//否则能量增加}i++;//进入下一个节点}if (power < 0) {return false;//出来了看一下导致出来的条件是什么//如果能量小于0,返回false} else {return true;//如果能量大于等于0,说明出来的条件是i>=n,返回true}}
void init() {arr.assign(n, 0);//初始化arr数组,分配空间for (int i = 0; i < n; i++) {cin >> arr[i];//初始化每一个元素nums_max = max(nums_max, arr[i]);//初始化nums_max}ret = nums_max;//初始化ret
}
void solve() {int l = 0, r = nums_max;//答案可能的区间是[0,nums_max]while (l <= r) {//二分答案法,二分所有可能值int mid = (l + r) >> 1;//中点值if (f(mid)) {//如果中点符合要求ret = mid;//记录答案r = mid - 1;//去左边找} else {l = mid + 1;//去右边找}}cout << ret;//输出结果
}signed main() {ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin >> n;init();solve();
}
// 64 位输出请用 printf("%lld")/*
有下标依次为0~n的建筑.机器人位于某一个建筑,并且有一个能量.
如果机器人要到达下一个建筑,有两种情况.
首先判断我的能量和下一个建筑的高度,如果建筑比我的能量高,我就会失去能量.
如果建筑能力比我的能量低或者相等,我就会获得能量.失去能量和获得能量,值是高度和能量的差值.
我要到达n号建筑,保证此时能量不为负数.
*/
/*
思路:
首先答案的最大值是数组的最大值nums_max
此时能量都是加,或者不变,一定不会减少,一定可以完成,到达n号建筑.
我们要求可能成为答案的最小值.
二分答案法*/

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

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

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

相关文章

【活动】开源与闭源大模型:探索未来趋势的双轨道路

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 开源与闭源大模型&#xff1a;探索未来趋势的双轨道路引言一、开源大模型&#…

翻译《The Old New Thing》- The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag

The importance of the FORMAT_MESSAGE_IGNORE_INSERTS flag - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20071128-00/?p24353 Raymond Chen 2007年11月28日 FORMAT_MESSAGE_IGNORE_INSERTS 标志的重要性 简要 文章讨论了使用FormatMes…

评估企业的业务是否存在高风险的六个步骤

风险的幽灵使得组织别无选择&#xff0c;只能改善各种网络风险的总体管理。以下是一个基于信息安全论坛的IRAM2方法论的分步过程&#xff0c;网络安全和风险从业者可以利用它来评估和管理信息风险。 第1步&#xff1a;范围界定练习 范围界定练习的目标是提供一个以业务为中心…

基于springboot+vue的招聘信息管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

K8s的常用命令以及yaml文件的创建

目录 一、声明式管理方法&#xff1a;YAML文件 1、yaml文件简介 2、yaml和json的主要区别&#xff1a; 3、YAML的语法格式 4、yaml文件组成部分 ①控制器定义 5、查看api资源版本标签 6、编写nginx-deployment.yaml资源配置清单 6.1创建资源对象 6.2查看创建的pod资源…

使用python将一段文本写入一个txt文件中且先格式化文件名

有一段文本内容&#xff0c;有“标题”和“内容”组成。 任务&#xff1a;要将这段文本&#xff0c;存放到一个txt文件中&#xff0c;文件名为当天的日期加上“标题”内容。因为“标题”内可能有/<>之类的&#xff0c;还需要格式化一下。 已经将上述功能都写成了函数&a…

安卓手机APP开发__近距离无线通信(NFC)概述

安卓手机&#xff21;&#xff30;&#xff30;开发&#xff3f;&#xff3f;近距离无线通信(NFC)概述 概述 近距离无线通信 (NFC) 是一组近距离无线技术&#xff0c;距离通常不超过 4 厘米才能 发起连接。通过 NFC&#xff0c;您可以在 NFC 标签和 Android 设备之间&#xf…

【Redis】 String类型的内部编码与使用环境

文章目录 &#x1f343;前言&#x1f334;内部编码&#x1f384;典型使用场景&#x1f6a9;缓存功能&#x1f6a9;计数&#xff08;Counter&#xff09;功能&#x1f6a9;共享会话&#xff08;Session&#xff09;&#x1f6a9;验证码功能 ⭕总结 &#x1f343;前言 本篇文章重…

Unity-Sprite Atlas+UGUI系统的运行原理

每日一句&#xff1a;别听世俗耳语&#xff0c;看自己的风景就好 目录 SA的原理&#xff1a; SA的优点&#xff1a; SA的缺点&#xff1a; DrawCall是什么&#xff1f; 批处理是什么&#xff1f; 我们先了解一下UGUI系统的运行原理吧&#xff01; 提到图集优化&#xff0…

cocosCreator动态生成二维码

cocosCreator 版本&#xff1a;3.7.2 开发语言&#xff1a;typeScript 我们在游戏开发中&#xff0c;经常会生成一个专属于玩家个人的二维码&#xff0c;比如说推广、充值等功能。 接到这个任务&#xff0c;在网上找了下&#xff0c;还是有很多教程的。但是这些教程大部分都是用…

Ollydbg动态分析MessageBoxA输出hellow world

一、目的 找到main函数找到调用的MessageBoxA函数 测试源码 #include <iostream> #include <windows.h>int main() {MessageBoxA(NULL, "Hellow World", "Title", MB_OK);return 1; }二、快捷键 指令快捷键说明RestartCtrlF2重新开始调试S…

buu[HCTF 2018]WarmUp(代码审计)

buu[HCTF 2018]WarmUp&#xff08;代码审计&#xff09; 题目 访问source.php <?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist ["source">"source.php","hint">"hint.php…

MySQL基础学习: SET FOREIGN_KEY_CHECKS = 0

文章目录 一、介绍二、使用方法三、注意事项 一、介绍 在MySQL中&#xff0c;SET FOREIGN_KEY_CHECKS 0; 是一个特殊的命令&#xff0c;用于临时禁用外键约束检查。这在你执行一些涉及多个表并且可能违反外键约束的批量操作时非常有用。 为什么需要禁用外键约束检查&#xf…

电脑键盘如何练习盲打?

电脑键盘如何练习盲打&#xff1f;盲打很简单&#xff0c;跟着我做&#xff0c;今天教会你。 请看【图1】&#xff1a; 【图1】中&#xff0c;红色方框就是8个基准键位&#xff0c;打字时我们左右手的8个手指就是放在这8个基准键位上&#xff0c;F键和J键上各有一个小突起&…

Spring6基础笔记

Spring6 Log4j2 1、概述 1.1、Spring是什么&#xff1f; Spring 是一款主流的 Java EE 轻量级开源框架 &#xff0c;Spring 由“Spring 之父”Rod Johnson 提出并创立&#xff0c;其目的是用于简化 Java 企业级应用的开发难度和开发周期。Spring的用途不仅限于服务器端的开发…

mysql图形化界面及将mysql注册成后台程序

安装图形化界面版本 右键新建数据库 字符集使用utf8防止以后数据库中存在中文字符导致乱码 将mysql注册成后台程序 cmd进入命令行界面 切换路径到cd /mysql/bin 将mysql注册成后台程序 mysqld.exe --install mysql1 (失败&#xff0c;说明没有权限) 以管理员身份打开成功…

ASP.NET防止流量攻击的措施

请求速率限制&#xff1a; // 在 Global.asax.cs 文件中 Application_BeginRequest 方法中添加以下代码 protected void Application_BeginRequest() {// 检查请求频率&#xff0c;限制每个 IP 地址的请求次数if (RequestThrottler.IsRequestLimitExceeded(Context.Request.Use…

如何跨过robots协议的限制爬取内容?

在讨论如何“跨过robots协议的限制爬取内容”之前&#xff0c;重要的是强调遵循网络礼仪和法律法规的必要性。robots协议&#xff08;Robots Exclusion Standard&#xff09;是网站所有者向网络爬虫&#xff08;包括搜索引擎和其他自动化工具&#xff09;传达其爬取意愿的一种方…

SYSTEM文件夹介绍(sys文件夹、deley文件夹、USART 文件夹、SysTick、printf函数、fputc函数、半主机模式)

参考 http://t.csdnimg.cn/P9H6x 一、sys文件夹介绍 在上述介绍的 sys 文件夹中&#xff0c;涉及了一些与系统控制、中断管理、低功耗模式、栈顶地址设置、系统时钟初始化以及缓存配置等相关的函数。以下是对每个功能的简要分析&#xff1a; 1.中断类函数&#xff1a; sys_n…

CCF20230901——坐标变换(其一)

CCF20230901——坐标变换&#xff08;其一&#xff09; #include<bits/stdc.h> using namespace std; int main() {int n,m,x[101],y[101],x1[101],y1[101];cin>>n>>m;for(int i0;i<n;i)cin>>x1[i]>>y1[i];for(int j0;j<m;j)cin>>x[…