华为od 员工派遣 C++
题目描述
某公司部门需要派遣员工去国外做项目。
现在,代号为 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个人
代码
#include <iostream>
using namespace std;
// 计算最小的 k,使得可以将编号在 [1, k] 中的员工分配给 x 国和 y 国,且满足 x 国和 y 国的需求
int findMinimumK(int x, int y, int cntx, int cnty) {
int k = cntx+cnty; //k取两者需要人数之和
if(k<x && k<y) //说明满足条件 直接返回 否则肯定有一个以上国家人员不满足要求
{
return k;
}
while(1)
{
if(k/x >=cnty) //不满足x的人去y国 且已经满足y的人数
{
cnty=0;//y已经满足了 不需要再考虑(这一步非必要)
if(k-k/x>=cntx) //是否满足另一要求
return k;
}
if(k/y >=cntx)
{
cntx = 0;
if(k-k/y>=cnty)
return k;
}
k++;
}
}
int main() {
int x, y, cntx, cnty;
cin >> x >> y >> cntx >> cnty;
int k = findMinimumK(x, y, cntx, cnty);
cout << k << endl;
return 0;
}