当前位置: 首页 > news >正文

算法练习题24——leetcode3296移山所需的最小秒数(二分模拟)

【题目描述】

 

【代码示例(java)】

class Solution {// 计算让工人们将山的高度降到0所需的最少时间public long minNumberOfSeconds(int mountainHeight, int[] workerTimes) {long left = 0; // 最少时间初始为0long right = 0; // 最大时间初始化为0// 计算每个工人在最坏情况下,单独完成整个山的工作所需的最大时间for (int workTime : workerTimes) {// workTime 是工人降低1个单位高度所需的时间// 公式计算从1降低到mountainHeight所需的总时间// 总工作量:1 + 2 + ... + mountainHeight = (mountainHeight * (mountainHeight + 1)) / 2// 总时间就是工人工作时间乘以这个总工作量right = Math.max(right, (long) workTime * (mountainHeight * (mountainHeight + 1L)) / 2L);}// 使用二分查找来寻找完成任务的最少时间// 这里的范围是 [left, right]while (left < right) {long mid = left + (right - left) / 2; // 计算中间时间,防止溢出// 检查在mid秒内是否可以完成任务if (can(mountainHeight, workerTimes, mid)) {right = mid; // 如果可以完成任务,缩小右边界} else {left = mid + 1; // 如果不能完成任务,增加左边界}}return left; // left即为最小的可以完成任务的时间}// 检查工人们能否在给定的time秒内将山的高度降到0private boolean can(int mountainHeight, int[] workerTimes, long time) {long totalReduceHeight = 0; // 总共降低的高度初始化为0// 遍历每个工人,计算他们在time秒内可以降低的最大高度for (int workTime : workerTimes) {long left = 0; // 当前工人能降低的最小高度初始化为0long right = mountainHeight; // 当前工人能降低的最大高度不会超过mountainHeight// 使用二分查找计算该工人在给定time秒内可以降低的最大高度while (left < right) {// 计算mid,这个mid是该工人可能降低的单位高度long mid = left + (right - left + 1) / 2; // 这里加1是为了偏向右边,避免死循环// 计算该工人降低mid个单位高度所需的时间:工作时间 * (1 + 2 + ... + mid)long requiredTime = workTime * mid * (mid + 1) / 2;// 如果当前时间够用,说明可以降低mid个单位高度if (requiredTime <= time) {left = mid; // 时间足够,增加高度} else {right = mid - 1; // 时间不足,降低高度}}// 当前工人能降低的最大高度是lefttotalReduceHeight += left; // 将该工人降低的高度累计到总高度上// 如果总的降低高度已经达到或超过山的高度,则任务可以完成,提前返回trueif (totalReduceHeight >= mountainHeight) {return true;}}// 如果所有工人合计降低的高度不足以将山的高度降为0,返回falsereturn totalReduceHeight >= mountainHeight;}
}

【最大值公式】

就是一个等差数列求和,加 L 是为了确保该数字被视为 long 类型,这样可以避免在大数计算时溢出的问题。在这道题的情况下,mountainHeight 可能会很大,因此在某些运算中需要将其转换为 long 类型来确保计算的正确性。 

好难 我要缺氧了谁来救我 谁 来 救救 本 小 主 哭.....

http://www.lryc.cn/news/444166.html

相关文章:

  • excel 单元格一直显示年月日
  • 【线程】线程的控制
  • 掌握 Spring:从新手到高手的常见问题汇总
  • 机器学习——Bagging
  • 日志体系结构与框架:历史、实现与如何在 Spring Cloud 中使用日志体系
  • 图文深入理解SQL语句的执行过程
  • ubuntu安装StarQuant
  • 学习篇 | Jupyter 使用(notebook hub)
  • 【裸机装机系列】8.kali(ubuntu)-虚拟内存swap交换分区扩展
  • 异步请求的方法以及原理
  • SpringCloud入门(六)Nacos注册中心(下)
  • 【RDMA】mlxlink检查和调试连接状态及相关问题--驱动工具
  • QT For Android开发-打开PPT文件
  • SpringBoot教程(三十) | SpringBoot集成Shiro权限框架
  • [ffmpeg] 视频格式转换
  • git-repo系列教程(3) git-repo https证书认证问题
  • 中序遍历二叉树全过程图解
  • 设计模式 组合模式(Composite Pattern)
  • 在vue中嵌入vitepress,基于markdown文件生成静态网页从而嵌入社团周报系统的一些想法和思路
  • 神经网络面试题目
  • C语言题目之单身狗2
  • Vue2学习笔记(03关于VueComponent)
  • 微服务架构中常用技术框架
  • [深度学习]Pytorch框架
  • 华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息
  • [Meachines] [Medium] Querier XLSM宏+MSSQL NTLM哈希窃取(xp_dirtree)+GPP凭据泄露
  • 新版ssh客户端无法连接旧版服务器sshd的方法
  • MyBatis操作数据库-XML实现
  • 华为HarmonyOS地图服务 5 - 利用UI控件和手势进行地图交互
  • 解决DockerDesktop启动redis后采用PowerShell终端操作