华为OD机试真题 Java 实现 快递投放问题
时间: 2024-05-04 15:21:15 浏览: 98
华为机试(JAVA)真题Od
题目描述:
快递员需要将 $n$ 个快递投递到 $m$ 个快递柜中,第 $i$ 个快递柜有 $a_i$ 个格子。快递员需要将每个快递投递到一个格子中,且每个格子只能存放一个快递。如果一个快递柜的所有格子都已经存放了快递,则快递员需要将快递存放到下一个有空格的快递柜中。请你编写一个算法,输出每个快递应该存放的位置。
输入:
- 第一行包含两个整数 $n$ 和 $m$,表示快递的数量和快递柜的数量。
- 第二行包含 $m$ 个整数 $a_1,a_2,\ldots,a_m$,表示每个快递柜的格子数量。
输出:
- 输出包含 $n$ 行,每行一个整数,表示对应快递的存放位置。
样例:
输入:
```
5 3
2 3 1
```
输出:
```
1
2
1
2
3
```
解释:快递 $1$ 存放在第 $1$ 个快递柜的第 $1$ 个格子中;快递 $2$ 存放在第 $2$ 个快递柜的第 $1$ 个格子中;快递 $3$ 存放在第 $1$ 个快递柜的第 $2$ 个格子中;快递 $4$ 存放在第 $2$ 个快递柜的第 $2$ 个格子中;快递 $5$ 存放在第 $3$ 个快递柜的第 $1$ 个格子中。
Java 实现:
```java
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt(); // 快递数量
int m = scanner.nextInt(); // 快递柜数量
int[] a = new int[m]; // 每个快递柜的格子数量
for (int i = 0; i < m; i++) {
a[i] = scanner.nextInt();
}
int[] ans = new int[n]; // 存放位置
int idx = 0; // 当前快递柜下标
for (int i = 0; i < n; i++) {
while (a[idx] == 0) { // 当前快递柜格子已满,找到下一个未满的快递柜
idx = (idx + 1) % m;
}
ans[i] = idx + 1; // 存放位置为当前快递柜下标加一
a[idx]--; // 当前快递柜剩余格子数减一
}
for (int i = 0; i < n; i++) {
System.out.println(ans[i]);
}
}
}
```
阅读全文