【华为OD机试】-(A卷+B卷+C卷+D卷)-2024真题合集目录
【华为OD机试】-(C卷+D卷)-2024最新真题目录
题目描述
某公司部门需要派遣员工去国外做项目。
现在,代号为 x 的国家和代号为 y 的国家分别需要 cntx 名和 cnty 名员工。
部门每个员工有一个员工号(1,2,3,......),工号连续,从1开始。
部长派遣员工的规则:
- 规则1:从 [1, k] 中选择员工派遣出去
- 规则2:编号为 x 的倍数的员工不能去 x 国,编号为 y 的倍数的员工不能去 y 国。
问题:
找到最小的 k,使得可以将编号在 [1, k] 中的员工分配给 x 国和 y 国,且满足 x 国和 y 国的需求。
输入描述
四个整数 x,y,cntx,cnty。
- 2 ≤ x < y ≤ 30000
- x 和 y 一定是质数
- 1 ≤ cntx, cnty < 10^9
- cntx + cnty ≤ 10^9
输出描述
满足条件的最小的k
用例1
输入
2 3 3 1
输出
5
说明
输入说明:
2 表示国家代号2
3 表示国家代号3
3 表示国家2需要3个人
1 表示国家3需要1个人
考点
二分查找
解题思路
首先,我们需要搞清楚一个数学问题,那么就是 1~k 范围内,x的倍数的数量该如何求解。
比如 1~10 范围内,2的倍数有:2,4,6,8,10,共计5个
比如 1~20 范围内,3的倍数有:3,6,9,12,15,18,共计6个
可以发现1~k范围内x的倍数的个数 = k // x,其中//表示整除。
证明也很简单,大家可以自行验证。
因此,我们可以得出1~k范围内:
x的倍数个数有:k // x 个,假设 A = k // x
y的倍数个数有:k // y 个,假设 B = k // y
同时,我们还需要关注 1~k 范围内:
x*y的倍数的个数有: k // (x*y) 个,假设 = C // (x*y)
即 1 ~ k 范围内:
x倍数且非y倍数的个数有:A - C 个
y倍数且非x倍数的个数有:B - C 个
我们可以让:
“x倍数且非y倍数” 的数去 y 国
"y倍数且非x倍数" 的数去 x 国
那么此时
x 国还差:max(0, cntx - (B-C)) 个
y 国还差:max(0, cnty - (A-C)) 个
而差的人可以从 1~k 范围内,非x倍数也非y倍数的数中选,而
非x倍数也非y倍数的值得数量有:k - A - B + C
因此,只要k满足下面不等式即可:
max(0, cntx - (B-C)) + max(0, cnty - (A-C)) ≤ k - A - B + C