Skip to content

Latest commit

 

History

History

2513.Minimize-the-Maximum-of-Two-Arrays

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

2513.Minimize-the-Maximum-of-Two-Arrays

本题如果直接去构造填充这两个数组的话,效率肯定非常低。于是反向思考是否能用二分搜值的方法。

假设这个最大值是n,那么我们可以计算出最多有a个元素可以放在集合A里(即不能被d1整除的元素),a = n - n/d1。同理,我们可以计算出最多有b个元素可以放在集合B里,b = n - n/d2.

另外,我们知道有一些数字可以既在集合A里,也可以在集合B里(即既不能被d1整除,也不能被d2整除)。这部分数字的个数是n减去“能被d1或者d2整除的个数”。后者的计算方法用到容斥原理:n/d1 + n/d2 - n / LCM(d1,d2). 所以我们记c = n - (n/d1 + n/d2 - n/ LCM(d1,d2).

接下来,我们考虑如果a < uniqueCnt1,那么意味着无法构造足够的元素装满A,说明n太小。同理,如果b < uniqueCnt2,那么意味着无法构造足够的元素装满B,也说明n太小。那么有人会问,如果a >= uniqueCnt1 && b >= uniqueCnt2,是不是意味着构造了太多的元素了呢?并不是,因为a和b有部分是重合的,其中有c的部分是可以在A与B之间自由调剂的,但是只能出现在A或B中的一个。所以实际可以构造的总数是a+b-c,如果a+b-c < uniqueCnt1+uniqueCnt2的话,那说明n太小了。

以上就是三个判定n太小(可构造的数字不够)的判据。以此我们可以二分搜索得到最小的n,使得恰好以上三个判据都不满足。