华为OD机试 2024D卷题库疯狂收录中,刷题点这里
专栏导读
本专栏收录于《华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天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。
五、Java算法源码
public class Test01 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 读取输入的四个整数 x, y, cntx, cnty
int x = scanner.nextInt();
int y = scanner.nextInt();
int cntx = scanner.nextInt();
int cnty = scanner.nextInt();
// 关闭Scanner
scanner.close();
// 找到最小的 k 使得能够满足需求
int k = findMinK(x, y, cntx, cnty);
// 输出结果
System.out.println(k);
}
// 查找最小的 k 使得可以满足两个国家的需求
public static int findMinK(int x, int y, int cntx, int cnty) {
int countX = 0; // 可以派遣到国家 x 的员工数
int countY = 0; // 可以派遣到国家 y 的员工数
int k = 0; // 当前编号
// 从 1 开始逐个检查编号,直到满足需求
while (countX < cntx || countY < cnty) {
k++;
if (k % x != 0) {
countX++;
}
if (k % y != 0) {
countY++;
}
}
return k;
}
}
六、效果展示
1、输入
2 3 3 1
2、输出
5
3、说明
2 表示国家代号2
3 表示国家代号3
3 表示国家2需要3个人
1 表示国家3需要1个人
🏆下一篇:华为OD机试 - 简易内存池 - 逻辑分析(Java 2024 C卷 200分)
🏆本文收录于,华为OD机试(JAVA)真题(D卷+C卷+A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。