题目描述:
某公司部门需要派遣员工去国外做项目。现在,代号为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个人
解题思路:
如果给定k,那我们十分容易找到是否满足条件。所以我们可以使用二分,枚举k值即可。
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
python代码:
import sys def check(k, x, y, cntx, cnty): A = k // x B = k // y C = k // (x * y) return max(0, cntx - (B - C)) + max(0, cnty - (A - C)) <= k - A - B + C def main(): x, y, cntx, cnty = map(int, sys.stdin.readline().split()) min_val = cntx + cnty max_val = 1000000000 while min_val <= max_val: mid = (min_val + max_val) // 2 if check(mid, x, y, cntx, cnty): max_val = mid - 1 else: min_val = mid + 1 print(min_val) if __name__ == "__main__": main()
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
完美分割线~~~~~~~~~~~创作不易,请点击关注、收藏
c++代码:
#include<bits/stdc++.h> #define int long long // 定义int类型为长整型,便于处理大数 using namespace std; // 定义检查函数,判断在员工编号上限为top时是否能满足国家的需求 bool ck(int x, int y, int cntx, int cnty, int top) { // codx, cody, codxy 分别是能被x、y、x*y整除的员工数量 int codx = top / x, cody = top / y, codxy = top / (x * y); // 只能去y国的员工数量 int goy = codx - codxy; // 只能去x国的员工数量