LeetCode解法汇总LCP 33. 蓄水

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给定 N 个无限容量且初始均空的水缸,每个水缸配有一个水桶用来打水,第 i 个水缸配备的水桶容量记作 bucket[i]。小扣有以下两种操作:

  • 升级水桶:选择任意一个水桶,使其容量增加为 bucket[i]+1
  • 蓄水:将全部水桶接满水,倒入各自对应的水缸

每个水缸对应最低蓄水量记作 vat[i],返回小扣至少需要多少次操作可以完成所有水缸蓄水要求。

注意:实际蓄水量 达到或超过 最低蓄水量,即完成蓄水要求。

示例 1:

输入:bucket = [1,3], vat = [6,8]

输出:4

解释: 第 1 次操作升级 bucket[0]; 第 2 ~ 4 次操作均选择蓄水,即可完成蓄水要求。

示例 2:

输入:bucket = [9,0,1], vat = [0,2,2]

输出:3

解释: 第 1 次操作均选择升级 bucket[1] 第 2~3 次操作选择蓄水,即可完成蓄水要求。

提示:

  • 1 <= bucket.length == vat.length <= 100
  • 0 <= bucket[i], vat[i] <= 10^4

解题思路:

* 思路:

* 分别尝试1次,2次,3次。。。N次蓄水操作。N的上限vat中的最大值。

* 每次尝试的时候,统计需要升级水桶的次数。两者之和就是需要操作的次数。

* 另外尝试蓄水次数的时候,如果蓄水次数大于当前的最小次数,则没必要继续尝试了。

* 则求出最小的次数即可。

代码:

#include <iostream>
#include <map>
#include <list>
#include <vector>
#include "Solution_LCP33.h"

int Solution_LCP33::storeWater(std::vector<int> &bucket, std::vector<int> &vat)
{
    int maxk = 0;
    for (int i = 0; i < vat.size(); i++)
    {
        if (vat[i] > maxk)
        {
            maxk = vat[i];
        }
    }
    if (maxk == 0)
    {
        return 0;
    }
    int res = std::numeric_limits<int>::max();
    for (int k = 1; k <= maxk && k < res; k++)
    {
        int t = 0;
        for (int i = 0; i < bucket.size(); i++)
        {
            int v = (vat[i] + k - 1) / k - bucket[i];
            if (v > 0)
            {
                t += v;
            }
        }
        if (t + k < res)
        {
            res = t + k;
        }
    }
    return res;
}

猜你喜欢

转载自blog.csdn.net/AA5279AA/article/details/130848752