LCP 33. 蓄水(暴力法)

在这里插入图片描述
主要是逆向思维,对需要倒水的次数进行遍历
每个桶如果倒i次水,则升级后的最小容量为atleast次
atleast-初始桶容量即为升级次数

// eg:例如倒了三次水 i=3,水缸容量为10 则桶容量至少为(10+3-1)/3=4次
// 如果水缸容量为9 则桶容量只需要3 即(9+3-1)/3=3
int atleast = (vat[j] + i - 1) / i;
//遍历次数可以简化为max+1 max=水缸的最大容量 极端条件下水桶容量为0,则最多可以升级max次,倒水一次

package Contest.contest7;

import java.util.Arrays;

/**
 * @Description: TODO
 * @author: lzm
 * @date: 2021年04月17日 19:06
 */

public class Test1 {
    public static void main(String[] args) {
        int[] bucket = {1, 3};
        int[] vat = {6, 8};
        Test1 test1 = new Test1();
        int i = test1.storeWater(bucket, vat);
        System.out.println(i);
    }

    public int storeWater(int[] bucket, int[] vat) {
        //找出水缸的最大容量
        int max = Arrays.stream(vat).max().orElse(-1);
        if (max == 0) {
            return 0;
        }
        int n = bucket.length;
        int cost = (int) 1e9;
//        遍历倒水次数
        for (int i = 1; i <= 10000; i++) {
//             每个水桶都是倒i次水
            int contrib = i;
//            遍历每个水桶,查出至少需要升级的次数
            for (int j = 0; j < n; j++) {
//             atleast=升级完成后的桶容量
//             atleast - bucket[j]= 每个水桶至少需要升级的次数
//             eg:例如倒了三次水  i=3,水缸容量为10 则桶容量至少为(10+3-1)/3=4次
//             如果水缸容量为9  则桶容量只需要3 即(9+3-1)/3=3
                int atleast = (vat[j] + i - 1) / i;
//             总共操作的次数=每个桶升级的次数(atleast - bucket[j])+倒水的次数(i次=contrib)
                contrib += Math.max(0, atleast - bucket[j]);
            }
            cost = Math.min(cost, contrib);
        }
        return cost;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值