华为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 开始,依次检查每个编号。
- 维护两个计数器 countX 和 countY,分别记录可以派遣到国家 x 和 y 的员工数。
- 遍历编号,如果编号 i 不是 x 的倍数,则 countX 增加;如果编号 i 不是 y 的倍数,则 countY 增加。
- 当 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在线答疑。