b_lc_蓄水(反向思维:枚举取水次数)
每个水缸对应最低蓄水量记作 vat[i],返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。有以下两种操作:
- 升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]+1
- 蓄水:将全部水桶接满水,倒入各自对应的水缸
注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。
示例 1:
输入:bucket = [1,3], vat = [6,8]
输出:4
解释:
第 1 次操作升级 bucket[0];
第 2 ~ 4 次操作均选择蓄水,即可完成蓄水要求。
思路:枚举取水次数,因为所有桶的打水次数都相同的,所以可先枚举打水次数 i,然后推出每个桶的容量,得到容量就知道了需要升级的次数
class Solution {
public:
int storeWater(vector<int>& bucket, vector<int>& vat) {
int mx = *max_element(vat.begin(), vat.end()), ans = INT_MAX;
if (mx == 0) return 0;
for (int i = 1; i <= mx; i++) { //取水次数
int tot = i;
for (int j = 0; j < vat.size(); j++) {
int atleast = vat[j] / i + (vat[j] % i != 0);
tot += max(atleast-bucket[j], 0);
}
ans = min(ans, tot);
}
return ans;
}
};