一、题目描述
某部门开展 Family Day 开放日活动,其中有个从桶里取球的游戏。
游戏规则如下:
有 N 个容量一样的小桶等距排开,且每个小桶都默认装了数量不等的小球,每个小桶装的小球数量记录在数组 bucketBallNums 中。
游戏开始时,要求所有桶的小球总数不能超过 SUM,如果小球总数超过 SUM,则需对所有的小桶统一设置一个容量最大值 maxCapacity 并需将超过容量最大值的小球拿出来,直至小桶里的小球数量小于 maxCapacity。
请您根据输入的数据,计算从每个小桶里拿出的小球数量。
限制规则一:
所有小桶的小球总和小于 SUM,则无需设置容量值 maxCapacity,并且无需从小桶中拿球出来,返回结果[]。
限制规则二:
如果所有小桶的小球总和大于 SUM,则需设置容量最大值 maxCapacity,并且需以小中拿球出来,返回从每小出的小球教量组成的数组。
二、输入描述
第一行输入 2 个正整数,数字之间使用空格隔开,其中第一个数字表示 SUM,第二个数字表示 bucketBallNums 数组长度;
第二行输入 N 个正整数,数字之间使用空格隔开,表示 bucketBallNums 的每一项;
三、输出描述
找到一个 maxCapacity,来保证取出尽量少的球,并返回从每个小桶拿出的小球数量组成的数组。
四、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] line1 = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 小球最大总数
int sum = line1[0];
// 桶的个数
int n = line1[1];
int[] arr = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();
// 球的总数
int count = 0;
// 桶内球的最大数量
int max_num = 0;
for (int i = 0; i < n; i++) {
count += arr[i];
max_num = Math.max(arr[i], max_num);
}
// 球小于sum的情况
if (count <= sum) {
System.out.println("[]");
return;
}
//容量的范围:
int min = sum / n;
int max = max_num;
int total = 0;
for (int i = max; i >= min; i--) {
for (int j = 0; j < n; j++) {
total += Math.min(i, arr[j]);
}
if (total <= sum) {
for (int j = 0; j < n; j++) {
arr[j] = Math.max(0, arr[j] - i);
}
System.out.println(Arrays.toString(arr));
return;
}
total = 0;
}
}
五、效果展示
1、输入
3 3
1 2 3
2、输出
[0, 1, 2]
3、说明
小球总数为6,sum为3,超出范围,需要从小桶中取出球,maxCapacity = 1,小球总数为3,从1号桶取0个球,从2号桶取1个球,从3号桶取2个球。
🏆下一篇:华为OD机试真题 Java 实现【获得完美走位】【2023Q1 100分】
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。