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;
    }
};
posted @ 2021-05-07 23:59  童年の波鞋  阅读(51)  评论(0编辑  收藏  举报