【C++二分查找】2594. 修车的最少时间

news2024/9/20 12:16:19

本文涉及的基础知识点

C++二分查找

LeetCode2594. 修车的最少时间

给你一个整数数组 ranks ,表示一些机械工的 能力值 。ranksi 是第 i 位机械工的能力值。能力值为 r 的机械工可以在 r * n2 分钟内修好 n 辆车。
同时给你一个整数 cars ,表示总共需要修理的汽车数目。
请你返回修理所有汽车 最少 需要多少时间。
注意:所有机械工可以同时修理汽车。
示例 1:
输入:ranks = [4,2,3,1], cars = 10
输出:16
解释:

  • 第一位机械工修 2 辆车,需要 4 * 2 * 2 = 16 分钟。
  • 第二位机械工修 2 辆车,需要 2 * 2 * 2 = 8 分钟。
  • 第三位机械工修 2 辆车,需要 3 * 2 * 2 = 12 分钟。
  • 第四位机械工修 4 辆车,需要 1 * 4 * 4 = 16 分钟。
    16 分钟是修理完所有车需要的最少时间。
    示例 2:
    输入:ranks = [5,1,8], cars = 6
    输出:16
    解释:
  • 第一位机械工修 1 辆车,需要 5 * 1 * 1 = 5 分钟。
  • 第二位机械工修 4 辆车,需要 1 * 4 * 4 = 16 分钟。
  • 第三位机械工修 1 辆车,需要 8 * 1 * 1 = 8 分钟。
    16 分钟时修理完所有车需要的最少时间。
    提示:
    1 <= ranks.length <= 105
    1 <= ranks[i] <= 100
    1 <= cars <= 106

C++二分查找

二分查找类型:寻找首端
Check函数的参数范围:[1,10e14]
Check函数:
f(mid,r) = (int)sqrt(mid/rank)
can = ∑ i : 0 n − 1 \sum_{i:0}^{n-1} i:0n1f(mid,rank(i))
return can >= cars
由于误差的原因:f(mid)符合时,试试f(mid+1)是否符合。

代码

核心代码

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:
			long long repairCars(vector<int>& ranks, int cars) {
				auto f = [&](long long mid, int r) {
					long long tmp = sqrt(mid / r);
					if (r * (tmp + 1) * (tmp + 1) <= mid) { return tmp + 1; }
					return tmp;
				};
				auto Check = [&](long long mid) {
					long long can = 0;
					for (const auto& r : ranks) {
						can += f(mid, r);
					}
					return can >= cars;
				};
				return CBinarySearch<long long>(1, 1e14 + 1).FindFrist(Check);
			}
		};

单元测试

vector<int> ranks;
		int cars;
		TEST_METHOD(TestMethod1)
		{
			ranks = { 1,2 }, cars = 1;
			auto res = Solution().repairCars(ranks, cars);
			AssertEx(1LL, res);
		}
		TEST_METHOD(TestMethod2)
		{
			ranks = {100 }, cars = 1'000'000;
			auto res = Solution().repairCars(ranks, cars);
			AssertEx(100*(long long)cars*cars, res);
		}
		TEST_METHOD(TestMethod11)
		{
			ranks = { 4, 2, 3, 1 }, cars = 10;
			auto res = Solution().repairCars(ranks, cars);
			AssertEx(16LL, res);
		}
		TEST_METHOD(TestMethod12)
		{
			ranks = { 5,1,8 }, cars = 6;
			auto res = Solution().repairCars(ranks, cars);
			AssertEx(16LL, 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++**实现。

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

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

相关文章

论文阅读笔记《面向集群协同的两点相对定位技术》

邓廷祥,任鹏,程甲,等.面向集群协同的两点相对定位技术[J].兵工学报,2023,44(S2):22-34. 摘要 无人机精确定位的三个难题&#xff1a; GNSS难以提供稳定准确的位置信息、难以部署辅助锚点、传统的相对定位方法大多存在节点数量限制。 本文针对上述问题&#xff0c;提出了一种GN…

Django 中的用户界面 - 创建速度计算器

在 Django 中创建一个用户界面来计算速度&#xff0c;可以通过以下步骤完成。这个速度计算器将允许用户输入距离和时间&#xff0c;计算并显示速度。 一、问题背景 一位 Django 新手希望使用 Django 构建一个用户界面&#xff0c;以便能够计算速度&#xff08;速度 距离/时间…

为什么 2!=false 和 2!=true 返回的都是true

前言 今天突然想起一个奇怪的问题&#xff0c;记录一下&#xff0c;我在控制台执行内容如下&#xff1a; 由上图可见&#xff0c;2 ! false 和 2 ! true 返回的值竟然都是true&#xff0c;那么为什么呢&#xff0c;请看下文&#xff1a; 1 ! 操作符的作用 ! 是“不等于”操作…

用了这个编程助手,“数学建模”真的太简单了~

目录 一、ChatGPT在数学建模中的价值1、学习和指导2、模型评估和改进3、算法设计和优化4、解释和文档生成 二、作为编程手如何正确使用ChatGPT1、阅读代码及优化代码2、执行脚本3、生成单测 三、编程手备战建模大赛的一些建议1、明确&#xff1a;如何去问一个问题2、程序设计能…

生日贺卡录放音芯片,多段音频录音ic生产厂商,NVF04M-32minute

可以录音播放的生日贺卡与传统的纸质贺卡相比&#xff0c;它有着创意以及个性的特点&#xff0c;仅需少量的电子元器件&#xff0c;即可实现录音功能&#xff0c;搭配上文字&#xff0c;让声音存储在生日贺卡里&#xff0c;让贺卡也变得有温度&#xff0c;祝福我想亲口对TA说。…

【计算机网络】描述TCP建立连接与断开的过程

一、TCP连接的建立与断开 1、建立连接——三次握手 1、A的TCP向B发出连接请求报文段 其首部中的同步位SYN 1&#xff0c;并选择序号seq x&#xff0c;表明传送数据时的第一个数据字节的序号是 x 2、B的TCP收到连接请求报文段后&#xff0c;如同意&#xff0c;则发回确认。 B …

Android 15 正式发布到 AOSP ,来了解下新特性和适配需求

其实在年初的时候就整理过《2024 &#xff0c;Android 15 预览版来了》 和《提前窥探 Android 15 的新功能与适配》的相关内容&#xff0c;而随着时间进度推进&#xff0c;近日谷歌也正式发布了 Android 15 的正式版&#xff0c;虽然没什么「大亮点」&#xff0c;但是作为开发者…

PDF 全文多语言 AI 摘要 API 数据接口

PDF 全文多语言 AI 摘要 API 数据接口 PDF / 文本摘要 AI 生成 PDF 文档摘要 AI 处理 / 智能摘要。 1. 产品功能 支持多语言摘要生成&#xff1b;支持 formdata 格式 PDF 文件流传参&#xff1b;快速处理大文件&#xff1b;基于 AI 模型&#xff0c;持续迭代优化&#xff1b;…

重置电脑系统和重装系统哪个好_重置电脑系统和重装有什么区别

如果电脑系统出现蓝屏或者卡顿的故障&#xff0c;相信不少用户会选择重装系统来解决。不过&#xff0c;经常折腾电脑的人群&#xff0c;可能知道在Windows10系统中会有“重置此电脑”的功能&#xff0c;类似于恢复出厂设置的意思。重置电脑系统和重装系统哪个好&#xff1f;重置…

Linux_kernel移植uboot07

一、移植 根据硬件平台的差异&#xff0c;将代码进行少量的修改&#xff0c;修改过后的代码在目标平台上运行起来 移植还需要考虑硬件环境&#xff0c;驱动只需要考虑内核的环境 二、移植内容 1、移植Uboot uboot属于bootloader的一种&#xff0c;还有其他的bootloader&#x…

30+程序员转行做什么工作比较好?这是最靠谱的答案

作为程序员来说&#xff0c;其实程序员的发展之路有多种&#xff0c;因为你有这方面的基础在这&#xff0c;你可以结合自己的实际情况去做出相应的选择。 在当今的AI时代&#xff0c;程序员的工作模式已经受到了很大的冲击。随着AI大模型的快速发展和应用&#xff0c;传统初级程…

Linux-文本处理三剑客:grep、sed-和-awk

awk、grep、sed是linux操作文本的三大利器&#xff0c;合称文本三剑客&#xff0c;也是必须掌握的linux命令之一。三者的功能都是处理文本&#xff0c;但侧重点各不相同&#xff0c;其中属awk功能最强大&#xff0c;但也最复杂。grep更适合单纯的查找或匹配文本&#xff0c;sed…

【Godot4自学手册】第四十六节实现闪电攻击、闪电链

本节内容&#xff0c;主要学习闪电攻击魔法。闪电攻击又名为闪电链&#xff0c;就是在几个敌人之间产生不断跳动的闪电攻击效果。本节主要实现的是单击鼠标右键&#xff0c;会在敌人之间产生随机的闪电链条&#xff0c;效果如下&#xff1a; 一、基本闪电的建立 新建2D场景&…

蚂蚁数科独立后首度公布业务进展和战略布局

“过去一年&#xff0c;蚂蚁数科客户数增长35%。旗下多个产品取得所属赛道市场份额第一。”9月5日下午&#xff0c;蚂蚁数科CEO赵闻飙在外滩大会媒体交流会上透露。这是自今年3月份蚂蚁数科独立化运营后&#xff0c;赵闻飙首次对外公布公司的业务进展及战略布局。 赵闻飙还透露…

分布式风电电池储能系统

风能作为一种清洁的可再生能源,越来越受到世界各国的*视。但风能随机波动的特点,造成风电出力的频繁波动,使电网的调频、调峰压力加大,成为长期困扰风电并网的主要难题。 我国的弃风限电*次出现于2010年,此后弃风从零星现象快速扩散,2012年的情况*为严*,弃风率达17%。之后随着…

使用iperf3进行网络性能测试的完整指南

目录 前言1. 什么是iperf3&#xff1f;2. 如何下载并安装iperf32.1 Ubuntu/Debian安装iperf32.2 CentOS安装2.3 Windows系统下安装iperf32.4 macOS系统下安装iperf3 3. iperf3命令详解3.1 基本命令3.2 常用参数说明3.3 其他常用参数 4. 使用iperf3测试网络性能4.1 TCP性能测试4…

flutter的入口和原生交互

从今天起&#xff0c;笔者要开始从flutter列表页面向原生页面跳转了 首先遇到了N个No such module "Flutter" 因为笔者的公司其实是从前往后改造Flutter的&#xff0c;所以也不需要引擎组&#xff0c;但是笔者搞不懂&#xff0c;只能照着葫芦画瓢&#xff0c;以后等…

不同大模型代码解释对比

包含ChatGPT&#xff0c;讯飞星火&#xff0c;通义千问&#xff0c;腾讯元宝&#xff0c;智谱清言。 目标是想让大模型解释一个用于预处理人体骨骼关节三维坐标数据样本进行填补空帧的Python函数。 def f_padding_none(data):s data.copy()# print(pad the null frames with…

Electron32-Vue3OS桌面管理os模板|vite5+electron32+arco后台os系统

原创新作electron32.xvue3arco.design仿ipad/windows桌面os系统。 基于最新跨平台技术Electron32、Vite5、Vue3 setup、Pinia2、Arco-Design、Echarts、Sortablejs实战开发桌面版osx管理系统。内置ipad/windows两种桌面风格模板、动态json配置桌面图标、自研栅格拖拽布局模板。…

Anthropic发布Claude企业计划 对标OpenAI的ChatGPT Enterprise

领先的人工智能初创公司 Anthropic 今天宣布推出Claude企业计划&#xff0c;以扩大Claude在企业中的应用。OpenAI 早在 2023 年就推出了名为ChatGPT Enterprise 的类似产品&#xff0c;并取得了相当大的成功。事实上&#xff0c;OpenAI 声称&#xff0c;财富 500 强中已有 92% …