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

【C++二分查找】1760. 袋子里最少数目的球

本文涉及的基础知识点

C++二分查找

LeetCode1760. 袋子里最少数目的球

给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。
你可以进行如下操作至多 maxOperations 次:
选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数 个球。
比方说,一个袋子里有 5 个球,你可以把它们分到两个新袋子里,分别有 1 个和 4 个球,或者分别有 2 个和 3 个球。
你的开销是单个袋子里球数目的 最大值 ,你想要 最小化 开销。
请你返回进行上述操作后的最小开销。
示例 1:
输入:nums = [9], maxOperations = 2
输出:3
解释:

  • 将装有 9 个球的袋子分成装有 6 个和 3 个球的袋子。[9] -> [6,3] 。
  • 将装有 6 个球的袋子分成装有 3 个和 3 个球的袋子。[6,3] -> [3,3,3] 。
    装有最多球的袋子里装有 3 个球,所以开销为 3 并返回 3 。
    示例 2:
    输入:nums = [2,4,8,2], maxOperations = 4
    输出:2
    解释:
  • 将装有 8 个球的袋子分成装有 4 个和 4 个球的袋子。[2,4,8,2] -> [2,4,4,4,2] 。
  • 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,4,4,4,2] -> [2,2,2,4,4,2] 。
  • 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,2,2,4,4,2] -> [2,2,2,2,2,4,2] 。
  • 将装有 4 个球的袋子分成装有 2 个和 2 个球的袋子。[2,2,2,2,2,4,2] -> [2,2,2,2,2,2,2,2] 。
    装有最多球的袋子里装有 2 个球,所以开销为 2 并返回 2 。
    示例 3:
    输入:nums = [7,17], maxOperations = 2
    输出:7
    提示:
    1 <= nums.length <= 105
    1 <= maxOperations, nums[i] <= 109

二分开销

二分类型:寻找首端
Check函数的参数范围:[1,1e9]
Check函数:
累加已有袋子需要的操作数need: nums[i]/mid+(0 != nums[i]%mid) -1 。return need <= maxOperations。

代码

核心代码

template<class INDEX_TYPE>
class CBinarySearch
{
public:CBinarySearch(INDEX_TYPE iMinIndex, INDEX_TYPE iMaxIndex):m_iMin(iMinIndex),m_iMax(iMaxIndex) {}template<class _Pr>INDEX_TYPE FindFrist( _Pr pr){auto left = m_iMin - 1;auto rightInclue = m_iMax;while (rightInclue - left > 1){const auto mid = left + (rightInclue - left) / 2;if (pr(mid)){rightInclue = mid;}else{left = mid;}}return rightInclue;}template<class _Pr>INDEX_TYPE FindEnd( _Pr pr){int leftInclude = m_iMin;int right = m_iMax + 1;while (right - leftInclude > 1){const auto mid = leftInclude + (right - leftInclude) / 2;if (pr(mid)){leftInclude = mid;}else{right = mid;}}return leftInclude;}
protected:const INDEX_TYPE m_iMin, m_iMax;
};class Solution {public:int minimumSize(vector<int>& nums, int maxOperations) {auto Check = [&](int mid) {long long need = 0;for (const auto& n : nums) {need += n / mid + (0 != n % mid)-1;}return need <= maxOperations;};return CBinarySearch<int>(1, 1'000'000'000).FindFrist(Check);}};

代码

vector<int> nums;int maxOperations;TEST_METHOD(TestMethod1){nums = { int(1e9+0.5) }, maxOperations = 0;auto res = Solution().minimumSize(nums, maxOperations);AssertEx(1'000'000'000, res);}TEST_METHOD(TestMethod11){nums = { 9 }, maxOperations = 2;auto res = Solution().minimumSize(nums, maxOperations);AssertEx(3, res);}TEST_METHOD(TestMethod12){nums = { 2,4,8,2 }, maxOperations = 4;auto res = Solution().minimumSize(nums, maxOperations);AssertEx(2, res);}TEST_METHOD(TestMethod13){nums = { 7,17 }, maxOperations = 2;auto res = Solution().minimumSize(nums, maxOperations);AssertEx(7, res);}

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • select、poll、epoll的区别
  • 组合模式composite
  • MySql约束练习
  • 5.3.数据结构-c/c++二叉树代码
  • C语言-第八章:指针进阶
  • 保研 比赛 利器: 用AI比赛助手降维打击数学建模
  • 内推|京东|后端开发|运维|算法...|北京 更多岗位扫内推码了解,直接投递,跟踪进度
  • 数据传输安全——混合加解密
  • 压缩PDF,介绍这五种压缩方案
  • 什么是Web服务器集群?
  • springboot服务器文件读取工具类
  • 一文梳理RAG(检索增强生成)的现状与挑战
  • Go语言结构体和元组全面解析
  • 【IPV6从入门到起飞】4-RTMP推流,ffmpeg拉流,纯HTML网页HLS实时直播
  • PyTorch 卷积层详解
  • 230. Kth Smallest Element in a BST
  • Bytom交易说明(账户管理模式)
  • Centos6.8 使用rpm安装mysql5.7
  • gcc介绍及安装
  • Github访问慢解决办法
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • Mysql5.6主从复制
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Rancher如何对接Ceph-RBD块存储
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 推荐一个React的管理后台框架
  • 线上 python http server profile 实践
  • 小而合理的前端理论:rscss和rsjs
  • 责任链模式的两种实现
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​queue --- 一个同步的队列类​
  • # 计算机视觉入门
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #Linux(Source Insight安装及工程建立)
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (14)Hive调优——合并小文件
  • (二)Linux——Linux常用指令
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)spring boot基于小程序酒店疫情系统 毕业设计 091931
  • (力扣)1314.矩阵区域和
  • (四)Controller接口控制器详解(三)
  • (转)iOS字体
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .htaccess配置常用技巧
  • .NET BackgroundWorker
  • .NET Project Open Day(2011.11.13)
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • // an array of int
  • @Documented注解的作用
  • @hook扩展分析
  • @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
  • @RequestParam详解
  • [ 物联网 ]拟合模型解决传感器数据获取中数据与实际值的误差的补偿方法
  • [AIGC] SpringBoot的自动配置解析
  • [Algorithm][综合训练][kotori和气球][体操队形][二叉树中的最大路径和]详细讲解