leetcode LCP33.蓄水(简单)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
思路:贪心+枚举
具体思路:对于任意一个水桶来看,要么升级水桶要么蓄水,如果蓄水之后再升级水桶之后可以满足,那么先升级水桶再蓄水一定满足,因为倒的水更多了,水缸更会倒满,因此我们可以先升级水桶,最后再蓄水。
细节:i枚举蓄水次数,取值范围是1->max(水缸容量),则满足i的最小水桶容量为 ceil(水缸大小/i) ,需要升级的次数为 ceil(水缸大小/i)-水桶容量,所有的水缸加起来即可所有的升级次数,加i即为总的次数,ans取i循环中的最小值即可。

class Solution {
public:
    int storeWater(vector<int>& bucket, vector<int>& vat) {
        
        int _max = *max_element(vat.begin(), vat.end());
        if (!_max) return 0; //
        int n = bucket.size(), ans = INT_MAX;
        for (int i = 1; i <= _max; ++i) {
            int tmp = i;
            for (int j = 0; j < n; ++j) {
                int rise = ceil(double(vat[j]) / i) - bucket[j];
                tmp += (rise > 0 ? rise : 0);
            }
            ans = min(ans, tmp);
        }
        return ans;
    }
};

细节
1:全是0时特殊讨论。
2:有可能满足的最小容量小于本身的容量,此时为负值,应该+0

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值