当前位置: 首页 > 面试经验 >

2024年华为OD机试真题-员工派遣

优质
小牛编辑
62浏览
2024-07-31

2024年华为OD机试真题-员工派遣

华为OD机试真题-员工派遣-2024年OD统一考试(D卷)

题目描述:

某公司部门需要派遣员工去国外做项目。现在,代号为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国的员工数量
 类似资料: