LCP 33. 蓄水

第一次参加力扣的LCP春季编程大赛,发现连到简单题都做了如此之久,之前刷题的时候感觉自己刷得不错,没想到这次比赛时发现简单题都做了很久,再转眼一看别的队伍这道题就4分钟,半小时做完6题全A,实在是差的太远了,这一耳光更加激起我好好练题的心。共勉
主要是总结部分。

LCP 33. 蓄水

题目描述

给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。小扣有以下两种操作:
升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]+1
蓄水:将全部水桶接满水,倒入各自对应的水缸
每个水缸对应最低蓄水量记作 vat[i],返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。
注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。

解答

这里用了比赛中第一名队伍的代码(🎉)

class Solution {
public:
    int storeWater(vector<int>& bucket, vector<int>& vat) {
        int ans=1e9;
        if(*max_element(vat.begin(),vat.end())==0)return 0;
        for(int i=1;i<=10000;++i){
            int n=vat.size(),sum=i;
            for(int j=0;j<n;++j){
                sum+=max(0,(vat[j]+i-1)/i-bucket[j]);
            }
            ans=min(ans,sum);
        }
        return ans;
    }
};
总结

操作逻辑上分为升级水桶倒水,这里代码中的思路是使用了循环遍历倒水的次数,那么每种倒水次数所需要的总操作数=倒水次数+每个水桶需要升级的次数,从每个倒水次数中,选取总操作数最小的就是答案。
上面说了思路,这回来说一下关于代码中使用的小细节总结:

sum+=max(0,(vat[j]+i-1)/i-bucket[j]);

代码中的这一句主要是为了在做除法时向上取整,比如vat[i]=7,bucket[i]=2,此时的倒水次数为2,那么⌈7/2⌉=4,而不是等于3,所以这里使用了 (vat[j]+i-1)/i 为的就是在vat无法整除倒水次数时为其加1,而能整除时因为 (i-1)/i=0 所以不会+1,以此达到向上取整的目的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值