列表

详情


LCP 33. 蓄水

给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。小扣有以下两种操作:

每个水缸对应最低蓄水量记作 vat[i],返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。

注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。

示例 1:

输入:bucket = [1,3], vat = [6,8]

输出:4

解释: 第 1 次操作升级 bucket[0]; 第 2 ~ 4 次操作均选择蓄水,即可完成蓄水要求。 vat1.gif

示例 2:

输入:bucket = [9,0,1], vat = [0,2,2]

输出:3

解释: 第 1 次操作均选择升级 bucket[1] 第 2~3 次操作选择蓄水,即可完成蓄水要求。

提示:

原站题解

去查看

上次编辑到这里,代码来自缓存 点击恢复默认模板
class Solution { public: int storeWater(vector<int>& bucket, vector<int>& vat) { } };

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
}

上一题