LCP 33. 蓄水
给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i
个水缸配备的水桶容量记作 bucket[i]
。小扣有以下两种操作:
bucket[i]+1
每个水缸对应最低蓄水量记作 vat[i]
,返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。
注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。
示例 1:
输入:
bucket = [1,3], vat = [6,8]
输出:
4
解释: 第 1 次操作升级 bucket[0]; 第 2 ~ 4 次操作均选择蓄水,即可完成蓄水要求。
示例 2:
输入:
bucket = [9,0,1], vat = [0,2,2]
输出:
3
解释: 第 1 次操作均选择升级 bucket[1] 第 2~3 次操作选择蓄水,即可完成蓄水要求。
提示:
1 <= bucket.length == vat.length <= 100
0 <= bucket[i], vat[i] <= 10^4
原站题解
typescript 解法, 执行用时: 124 ms, 内存消耗: 42.5 MB, 提交时间: 2023-09-27 14:35:25
function storeWater(bucket: number[], vat: number[]): number { const mx = Math.max(...vat); if (mx === 0) { return 0; } const n = vat.length; let ans = 1 << 30; for (let x = 1; x <= mx; ++x) { let y = 0; for (let i = 0; i < n; ++i) { y += Math.max(0, Math.ceil(vat[i] / x) - bucket[i]); } ans = Math.min(ans, x + y); } return ans; }
cpp 解法, 执行用时: 132 ms, 内存消耗: 8.2 MB, 提交时间: 2023-09-27 14:35:11
class Solution { public: int storeWater(vector<int>& bucket, vector<int>& vat) { int mx = *max_element(vat.begin(), vat.end()); if (mx == 0) { return 0; } int ans = 1 << 30; int n = bucket.size(); for (int x = 1; x <= mx; ++x) { int y = 0; for (int i = 0; i < n; ++i) { y += max(0, (vat[i] + x - 1) / x - bucket[i]); } ans = min(ans, x + y); } return ans; } };
java 解法, 执行用时: 58 ms, 内存消耗: 38.7 MB, 提交时间: 2023-09-27 14:34:56
class Solution { public int storeWater(int[] bucket, int[] vat) { int mx = Arrays.stream(vat).max().getAsInt(); if (mx == 0) { return 0; } int n = vat.length; int ans = 1 << 30; for (int x = 1; x <= mx; ++x) { int y = 0; for (int i = 0; i < n; ++i) { y += Math.max(0, (vat[i] + x - 1) / x - bucket[i]); } ans = Math.min(ans, x + y); } return ans; } }
python3 解法, 执行用时: 3552 ms, 内存消耗: 16 MB, 提交时间: 2023-09-27 14:34:32
class Solution: # 贪心,优先升级水桶 def storeWater(self, bucket: List[int], vat: List[int]) -> int: mx = max(vat) if mx == 0: return 0 ans = inf for x in range(1, mx + 1): y = sum(max(0, (v + x - 1) // x - b) for v, b in zip(vat, bucket)) ans = min(ans, x + y) return ans
golang 解法, 执行用时: 212 ms, 内存消耗: 2.3 MB, 提交时间: 2021-06-07 16:16:11
func storeWater(bucket []int, vat []int) int { max := 0 for _, v := range vat { if max < v { max = v } } if max == 0 { return 0 } n := len(bucket) ans := math.MaxInt32 for i := 1; i <= max; i++ { //每次倒水量 per := 0 //倒水i次,所以操作次数+i cur := i //遍历每个水缸 for j := 0; j < n; j++ { // 水槽容量/倒水次数=每次倒水量 per = (vat[j] + i - 1) / i // 每次倒水量-初始水量=需要升级次数 if per-bucket[j] > 0 { cur += per - bucket[j] } } //所有倒水次数中,取最小的操作次数 if ans > cur { ans = cur } } return ans }