目录链接:
力扣编程题-解法汇总_分享+记录-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;
}