华为OD机试 - 员工派遣(Python/JS/C/C++ 2024 D卷 200分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

某公司部门需要派遣员工去国外做项目。

现在,代号为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一定是质数

三、输出描述

满足条件的最小的k

四、测试用例

1、输入

2 3 3 1

2、输出

5

3、说明

2 表示国家代号2
3 表示国家代号3
3 表示国家2需要3个人
1 表示国家3需要1个人

五、解题思路

我们需要找到最小的 k,使得从编号 1 到 k 的员工中可以满足两个国家 x 和 y 对员工的需求。要注意的是:

编号为 x 的倍数的员工不能派遣到国家 x。
编号为 y 的倍数的员工不能派遣到国家 y。

具体步骤实现

  1. 从编号 1 开始,依次检查每个编号。
  2. 维护两个计数器 countX 和 countY,分别记录可以派遣到国家 x 和 y 的员工数。
  3. 遍历编号,如果编号 i 不是 x 的倍数,则 countX 增加;如果编号 i 不是 y 的倍数,则 countY 增加。
  4. 当 countX 和 countY 分别达到 cntx 和 cnty 时,记录当前的编号 k。

六、Python算法源码

def od_test():
    x = int(input())
    y = int(input())
    cntx = int(input())
    cnty = int(input())

    k = 1
    # 既可以去x国也可以去y国的个数
    common = 0
    # x的倍数的个数
    nx = 0
    # y的倍数的个数
    ny = 0

    while cntx > 0 or cnty > 0:
        if (k % x == 0) and (k % y == 0):
            # k为x和y的公倍数时不可用
            k += 1
            continue

        if k % x == 0:
            nx += 1
        elif k % y == 0:
            ny += 1
        else:
            common += 1

        # x国还需要的差值
        diffx = cntx - ny
        if diffx < 0:
            diffx = 0

        # y国还需要的差值
        diffy = cnty - nx
        if diffy < 0:
            diffy = 0

        if common >= (diffx + diffy):
            break

        k += 1

    print(k)

# 调用函数
od_test()

七、JavaScript算法源码

function odTest() {
    const prompt = require('prompt-sync')();
    let x = parseInt(prompt());
    let y = parseInt(prompt());
    let cntx = parseInt(prompt());
    let cnty = parseInt(prompt());

    let k = 1;
    // 既可以去x国也可以去y国的个数
    let common = 0;
    // x的倍数的个数
    let nx = 0;
    // y的倍数的个数
    let ny = 0;

    while (cntx > 0 || cnty > 0) {
        if ((k % x === 0) && (k % y === 0)) {
            // k为x和y的公倍数时不可用
            k++;
            continue;
        }

        if (k % x === 0) {
            nx++;
        } else if (k % y === 0) {
            ny++;
        } else {
            common++;
        }

        // x国还需要的差值
        let diffx = cntx - ny;
        if (diffx < 0) {
            diffx = 0;
        }

        // y国还需要的差值
        let diffy = cnty - nx;
        if (diffy < 0) {
            diffy = 0;
        }

        if (common >= (diffx + diffy)) {
            break;
        }

        k++;
    }

    console.log(k);
}

// 调用函数
odTest();

八、C算法源码

#include <stdio.h>

int main() {
    int x, y, cntx, cnty;
    
    // 输入四个整数
    scanf("%d %d %d %d", &x, &y, &cntx, &cnty);

    int k = 1;
    // 既可以去x国也可以去y国的个数
    int common = 0;
    // x的倍数的个数
    int nx = 0;
    // y的倍数的个数
    int ny = 0;

    while (cntx > 0 || cnty > 0) {
        if ((k % x == 0) && (k % y == 0)) {
            // k为x和y的公倍数时不可用
            k++;
            continue;
        }

        if (k % x == 0) {
            nx++;
        } else if (k % y == 0) {
            ny++;
        } else {
            common++;
        }

        // x国还需要的差值
        int diffx = cntx - ny;
        if (diffx < 0) {
            diffx = 0;
        }

        // y国还需要的差值
        int diffy = cnty - nx;
        if (diffy < 0) {
            diffy = 0;
        }

        if (common >= (diffx + diffy)) {
            break;
        }

        k++;
    }

    printf("%d\n", k);
    
    return 0;
}

九、C++算法源码

#include <iostream>
using namespace std;

int main() {
    int x, y, cntx, cnty;

    // 输入四个整数
    cin >> x >> y >> cntx >> cnty;

    int k = 1;
    // 既可以去x国也可以去y国的个数
    int common = 0;
    // x的倍数的个数
    int nx = 0;
    // y的倍数的个数
    int ny = 0;

    while (cntx > 0 || cnty > 0) {
        if ((k % x == 0) && (k % y == 0)) {
            // k为x和y的公倍数时不可用
            k++;
            continue;
        }

        if (k % x == 0) {
            nx++;
        } else if (k % y == 0) {
            ny++;
        } else {
            common++;
        }

        // x国还需要的差值
        int diffx = cntx - ny;
        if (diffx < 0) {
            diffx = 0;
        }

        // y国还需要的差值
        int diffy = cnty - nx;
        if (diffy < 0) {
            diffy = 0;
        }

        if (common >= (diffx + diffy)) {
            break;
        }

        k++;
    }

    cout << k << endl;

    return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
通信误码是通信过程中由于噪声、信号衰减或其他干扰因素引起的信号错误。解决通信误码的问题是通信领域中非常重要的一项任务。下面是我基于Python的解答: 首先,我们需要定义一个函数来计算两个二进制数字之间的汉明距离,即不同位置的比特数。可以通过将两个二进制数字进行逐位比较来实现。如果两个比特值不同,则汉明距离加1。代码如下: ```python def hamming_distance(bin_1, bin_2): distance = 0 for i in range(len(bin_1)): if bin_1[i] != bin_2[i]: distance += 1 return distance ``` 接下来,我们需要通过输入的二进制数字列表来判断是否存在误码。可以使用两个嵌套的循环来比较所有的数字对,并使用汉明距离函数计算它们之间的距离。如果距离小于等于1,则存在误码。代码如下: ```python def check_error_codes(bin_list): n = len(bin_list) for i in range(n-1): for j in range(i+1, n): distance = hamming_distance(bin_list[i], bin_list[j]) if distance <= 1: return True return False ``` 最后,我们可以编写一个简单的主程序来测试上述函数。首先,从用户输入中获取二进制数字列表,然后调用`check_error_codes`函数来检查是否存在误码。根据检查结果,输出相应的提示信息。代码如下: ```python if __name__ == "__main__": bin_list = input("请输入二进制数字列表,以逗号隔:") bin_list = bin_list.split(",") has_error_codes = check_error_codes(bin_list) if has_error_codes: print("存在误码") else: print("不存在误码") ``` 这样,我们就可以使用上述代码来检查给定的二进制数字列表中是否存在误码。希望这个解答能够帮助你理解该问题的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哪 吒

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

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

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

打赏作者

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

抵扣说明:

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

余额充值