LCP 33. 蓄水
# LCP 33. 蓄水
解题思路:想不到一个数的加法与商的最低操作数时,那么就直接贪心,遍历枚举所有的可能次数。
如果得知蓄水总操作数量k,那么总的操作数可以按如下计算得出:
①蓄水次数 i —>②每个水桶所需要达到的蓄水容量—>③升级每个水桶容量所需要的升级次数
而这个蓄水次数,可能会跟单个桶的最优蓄水次数数学问题有关,又可能受到多个桶最优次数限制,因此最直接的方式就是贪心法枚举,该蓄水次数 i 通过两个约束限制其大小:
- i 不会超过初始状态下每个桶的蓄水次数的最大值。因为后续还会升级水桶容量,所以蓄水次数只会比初始状态下的次数更小。(需要考虑水桶和水缸初始容量为0情况)
- i 蓄水次数不会超过当前枚举过程中,得到的每个总操作数结果。即 i '<i + upstep。
class Solution {
public int storeWater(int[] bucket, int[] vat) {
int maxStep=0;
for(int i=0;i<bucket.length;i++){
if(vat[i]==0) continue;
if(bucket[i]==0){
maxStep=vat[i]>maxStep?vat[i]:maxStep;
continue;
}
int temp=vat[i]%bucket[i]==0?vat[i]/bucket[i]:vat[i]/bucket[i]+1;
maxStep=temp>maxStep?temp:maxStep;
}
if(maxStep==0) return 0;
int ans=Integer.MAX_VALUE;
for(int i=1;i<=maxStep&&i<ans;i++){
int up=0;
for(int j=0;j<bucket.length;j++){
int container=vat[j]%i==0?vat[j]/i:vat[j]/i+1;
int uptemp=container<bucket[j]?0:container-bucket[j];
up+=uptemp;
}
int sum=up+i;
ans=sum<ans?sum:ans;
}
return ans;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
编辑 (opens new window)
上次更新: 2023/12/15, 15:49:57