【二分查找 数论】2513. 最小化两个数组中的最大值

本文涉及知识

二分查找算法合集
质数、最大公约数、菲蜀定理

LeetCode2513. 最小化两个数组中的最大值

给你两个数组 arr1 和 arr2 ,它们一开始都是空的。你需要往它们中添加正整数,使它们满足以下条件:
arr1 包含 uniqueCnt1 个 互不相同 的正整数,每个整数都 不能 被 divisor1 整除 。
arr2 包含 uniqueCnt2 个 互不相同 的正整数,每个整数都 不能 被 divisor2 整除 。
arr1 和 arr2 中的元素 互不相同 。
给你 divisor1 ,divisor2 ,uniqueCnt1 和 uniqueCnt2 ,请你返回两个数组中 最大元素 的 最小值 。
示例 1:
输入:divisor1 = 2, divisor2 = 7, uniqueCnt1 = 1, uniqueCnt2 = 3
输出:4
解释:
我们可以把前 4 个自然数划分到 arr1 和 arr2 中。
arr1 = [1] 和 arr2 = [2,3,4] 。
可以看出两个数组都满足条件。
最大值是 4 ,所以返回 4 。
示例 2:
输入:divisor1 = 3, divisor2 = 5, uniqueCnt1 = 2, uniqueCnt2 = 1
输出:3
解释:
arr1 = [1,2] 和 arr2 = [3] 满足所有条件。
最大值是 3 ,所以返回 3 。
示例 3:
输入:divisor1 = 2, divisor2 = 4, uniqueCnt1 = 8, uniqueCnt2 = 2
输出:15
解释:
最终数组为 arr1 = [1,3,5,7,9,11,13,15] 和 arr2 = [2,6] 。
上述方案是满足所有条件的最优解。
提示:
2 <= divisor1, divisor2 <= 105
1 <= uniqueCnt1, uniqueCnt2 < 109
2 <= uniqueCnt1 + uniqueCnt2 <= 109

二分查找

d = divisor c = uniqueCnt
我们判断[1,mid]能否满足上述要求:
∀ x ∈ [ 1 , m i d ] \forall x \in [1,mid] x[1,mid]
{ 无法使用 被 d 1 和 d 2 整除 放到数组 1 被 d 2 整除 放到数组 2 到 d 1 整除 可以放到数组 1 或数组 2 o t h e r \begin{cases} 无法使用 && 被d1和d2整除 \\ 放到数组1 && 被d2整除\\ 放到数组2 && 到d1整除\\ 可以放到数组1或数组2 && other\\ \end{cases} 无法使用放到数组1放到数组2可以放到数组1或数组2d1d2整除d2整除d1整除other
long long ll = m/lcm(d1,k1)
long long ll1 = m/d1 - ll;
long long ll2 = m/d2 -ll;
必定被浪费的数ll5:ll + max(11-c2,0)+max(l2-c1,0)
Check函数: m-ll5 >= c1+c2
Check函数的返回值从false逐步变为true,我们求第一个true。
易错点:
long long ll1 = m/d1 - ll; 别忘记了ll。
lcm((long long)divisor1, (long long)divisor2); 两个正数的最小公倍数可能是long long。

代码

核心代码

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;}
protected:const INDEX_TYPE m_iMin, m_iMax;
};class Solution {
public:int minimizeSet(int divisor1, int divisor2, int uniqueCnt1, int uniqueCnt2) {auto Check = [&](long long mid) {const long long ll = mid / lcm((long long)divisor1, (long long)divisor2);const long long ll1 = mid / divisor1 -ll;const long long ll2 = mid / divisor2 -ll;const long long ll5 = ll + max(ll1 - uniqueCnt2, 0LL) + max(ll2 - uniqueCnt1, 0LL);return mid - ll5 >= uniqueCnt1 + uniqueCnt2;};CBinarySearch<long long> bs(1, 4e9);return bs.FindFrist(Check);}
};

单元测试

template<class T1, class T2>
void AssertEx(const T1& t1, const T2& t2)
{Assert::AreEqual(t1, t2);
}template<class T>
void AssertEx(const vector<T>& v1, const vector<T>& v2)
{Assert::AreEqual(v1.size(), v2.size());for (int i = 0; i < v1.size(); i++){Assert::AreEqual(v1[i], v2[i]);}
}template<class T>
void AssertV2(vector<vector<T>> vv1, vector<vector<T>> vv2)
{sort(vv1.begin(), vv1.end());sort(vv2.begin(), vv2.end());Assert::AreEqual(vv1.size(), vv2.size());for (int i = 0; i < vv1.size(); i++){AssertEx(vv1[i], vv2[i]);}
}namespace UnitTest
{int divisor1,  divisor2,  uniqueCnt1,  uniqueCnt2;TEST_CLASS(UnitTest){public:TEST_METHOD(TestMethod00){divisor1 = 2, divisor2 = 7, uniqueCnt1 = 1, uniqueCnt2 = 3;			auto res = Solution().minimizeSet(divisor1, divisor2, uniqueCnt1, uniqueCnt2);AssertEx(4, res);}TEST_METHOD(TestMethod01){divisor1 = 3, divisor2 = 5, uniqueCnt1 = 2, uniqueCnt2 = 1;auto res = Solution().minimizeSet(divisor1, divisor2, uniqueCnt1, uniqueCnt2);AssertEx(3, res);}TEST_METHOD(TestMethod02){divisor1 = 2, divisor2 = 4, uniqueCnt1 = 8, uniqueCnt2 = 2;auto res = Solution().minimizeSet(divisor1, divisor2, uniqueCnt1, uniqueCnt2);AssertEx(15, res);}TEST_METHOD(TestMethod03){divisor1 = 92761, divisor2 = 48337, uniqueCnt1 = 208563424, uniqueCnt2 = 9115778;auto res = Solution().minimizeSet(divisor1, divisor2, uniqueCnt1, uniqueCnt2);AssertEx(217679202, 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://xiahunao.cn/news/3270233.html

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

相关文章

栈和队列<数据结构 C版>

目录 栈&#xff08;Stack&#xff09; 栈的结构体 初始化 销毁 入栈 判空 出栈 取栈顶元素 获取栈个数 测试&#xff1a; 队列&#xff08;Queue&#xff09; 队列的结构体 单个结点 队列 初始化 销毁 入队列&#xff0c;队尾 判空 出队列&#xff0c;队头 …

贪心算法.

哈夫曼树 哈夫曼树&#xff08;Huffman Tree&#xff09;&#xff0c;又称为霍夫曼树或最优二叉树&#xff0c;是一种带权路径长度最短的二叉树&#xff0c;常用于数据压缩。 定义&#xff1a;给定N个权值作为N个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树…

大话成像公众号文章阅读学习(一)

系列文章目录 文章目录 系列文章目录前言一、扫射拍摄二、索尼Alpha 9 III2.1. 视频果冻效应2.2 闪光灯同步速度2.3 其他功能 三 A9III 局限性总结 前言 大话成像是一个专注成像的公众号&#xff0c;文章都很好。 今天看的这篇是 特朗普遭枪击后“大片”出自它 文章地址 htt…

Python | Leetcode Python题解之第284题窥视迭代器

题目&#xff1a; 题解&#xff1a; class PeekingIterator:def __init__(self, iterator):self.iterator iteratorself._next iterator.next()self._hasNext iterator.hasNext()def peek(self):return self._nextdef next(self):ret self._nextself._hasNext self.itera…

SGLang 大模型推理框架 qwen2部署使用案例;openai接口调用、requests调用

参考: https://github.com/sgl-project/sglang 纯python写,号称比vllm、tensorRT还快 暂时支持模型 安装 可以pip、源码、docker安装,这里用的pip 注意flashinfer安装最新版,不然会可能出错误ImportError: cannot import name ‘top_k_top_p_sampling_from_probs’ fr…

万物互联,触手可及“2024南京智慧城市,物联网,大数据展会”

在金秋送爽的11月&#xff0c;南京这座历史悠久而又充满活力的城市&#xff0c;即将迎来一场科技盛宴——2024南京智慧城市、物联网、大数据展会。这不仅是一场技术的集会&#xff0c;更是未来生活蓝图的预览&#xff0c;它汇聚了全球顶尖的科技企业、创新者及行业精英&#xf…

1.2 单链表定义及操作实现(链式结构)

1.单链表定义 链式存储&#xff1a;用一组任意的存储单元存储线性表中的数据元素。用这种方法存储的线性 表简称线性链表。 为了正确表示结点间的逻辑关系&#xff0c;在存储每个结点值的同时&#xff0c;还必须存储指示其直接 后继结点的地址&#xff08;或位置&#xff09;…

04-Charles中的Map Remote和Map Local介绍

Charles提供了Map Remote和Map Local两个功能。 Map Remote是将指定的网络请求重定向到另一个网址。Map Local是将指定的网络请求重定向到本地文件。 一、Map Remote 假设代码中调用了接口A&#xff0c;但是接口A的响应结果不能满足需求&#xff1b;此时&#xff0c;有另一个…

第15周 Zookeeper分布式锁与变种多级缓存

Zookeeper **************************************************************

heic怎么转换成jpg?heic转jpg,分享6款图片格式转换器免费汇总!

众所周知&#xff0c;在与非苹果手机设备用户&#xff08;如安卓手机或Windows台式机用户&#xff09;分享照片之前&#xff0c;通常需要将iphone的heic格式转换为jpg。由于这些操作系统的旧版本不原生支持heic图片格式&#xff0c;因此需要额外的第三方工具来查看这些图像。因…

0727,学什么学,周六就应该休息!!!!!

周六就应该休息&#xff0c;一天就忙了两小时也不是我的错喵 目录 UDP的小总结 01&#xff1a;使用select实现一个基于UDP的一对一即时聊天程序。 1.0 复读机服务器和树洞客户端 2.0 byby不了一点的敬业服务器&#xff01;&#xff01;&#xff01; 今天到此为止&#x…

24暑假算法刷题 | Day22 | LeetCode 77. 组合,216. 组合总和 III,17. 电话号码的字母组合

目录 77. 组合题目描述题解 216. 组合总和 III题目描述题解 17. 电话号码的字母组合题目描述题解 77. 组合 点此跳转题目链接 题目描述 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 示例 1&#xff1a; 输…

面向切面编程(AOP)

通知类型 Grep Console插件可右键选中日志高亮显示 正常情况 异常情况(around after和目标方法在一起&#xff0c;目标方法异常后&#xff0c;around after不执行) 通知顺序 execution 需要匹配两个没有任意交集的方法时&#xff0c;可以使用两个execution annotation 自定义…

【计算机网络】期末实验答辩

注意事项&#xff1a; 1&#xff09;每位同学要在下面做过的实验列表中选取三个实验进行答辩准备&#xff0c;并将自己的姓名&#xff0c;学号以及三个实验序号填入共享文档"1&#xff08;2&#xff09;班答辩名单"中。 2&#xff09;在答辩当日每位同学由老师在表…

支持向量机 及其分类案例详解(附Python 代码)

支持向量机分类器预测收入等级 我们将构建一个支持向量机&#xff08;SVM&#xff09;分类器&#xff0c;以预测一个人基于14个属性的收入等级。我们的目标是判断收入是否高于或低于每年$50,000。因此&#xff0c;这是一个二元分类问题。我们将使用在此处可用的人口普查收入数…

Python高维度大型气象矩阵存储策略分享

零、前情提要 最近需要分析全球范围多变量的数值预报数据&#xff0c;将grb格式的数据下载下来经过一通处理后需要将预处理数据先保存一遍&#xff0c;方便后续操作&#xff0c;处理完发现此时的数据维度很多&#xff0c;数据量巨大&#xff0c;使用不同的保存策略的解析难度和…

nowcoder bc49判断两个数的大小关系

描述 KiKi想知道从键盘输入的两个数的大小关系&#xff0c;请编程实现。 输入描述&#xff1a; 题目有多组输入数据&#xff0c;每一行输入两个整数&#xff08;范围-231~231-1&#xff09;&#xff0c;用空格分隔。 输出描述&#xff1a; 针对每行输入&#xff0c;输出两…

zotfile基础配置详解

zotfile可以将自动移动pdf到指定文件夹中&#xff0c;那么应该如何配置呢&#xff1f; 遵循极简原则&#xff0c;只需配置两个地方即可。 一、路径配置 第一处是pdf附件存放的位置&#xff0c;可以指定自己想要的地方&#xff0c;我放在了C盘的文档文件夹下。 第二处是分类法…

由恶劣事件: CrowdStrike发布案例更新导致微软全球蓝屏事件的启示

前言 网络安全公司 CrowdStrike 周四发布软件更新后&#xff0c;机场、银行、证券交易所、911 服务、交通系统、酒店、新闻媒体、医院、紧急服务等开始出现臭名昭著的蓝屏死机 (BSOD)。在看似多年来最严重的 IT 中断中&#xff0c;大规模的网络安全软件问题正在全球范围内造成…

【七】Hadoop3.3.4基于ubuntu24的分布式集群安装

文章目录 1. 下载和准备工作1.1 安装包下载1.2 前提条件 2. 安装过程STEP 1: 解压并配置Hadoop选择环境变量添加位置的原则检查环境变量是否生效 STEP 2: 配置Hadoop2.1. 修改core-site.xml2.2. 修改hdfs-site.xml2.3. 修改mapred-site.xml2.4. 修改yarn-site.xml2.5. 修改hado…