2024华为OD机试真题-员工排遣-(C++/Java/Python)-C卷D卷-200分

【华为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

代码

c++

                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2024剑指offer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值