简单
70
相关企业
给定 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
通过次数
8.1K
提交次数
31.2K
通过率
26.0%
题目分析:题意很简单,就是两种操作,每次操作会增加一次操作步数,求最小操作步数。转换为数学问题就是:min(x+max(vat[i]/bucket[i])),其中,当bucket[i]满足max(vat[i]/bucket[i])的时候,x++,bucket[i]++,第一反应是不是应该动态规划,想了半天不知道怎么规划;于是退而求其次,使用模拟法来求解。基本思路就是既然题目肯定有一个最小值,那我只要控制x的范围,让x不断增加,总有一个最小值,考虑到数据范围,x的值上限为10000。
其他细节看注释,以下是代码:
class Solution {
public:
int storeWater(vector<int>& bucket, vector<int>& vat) {
// 考虑到升级,每次只能升级一只桶,所以如果bucket[i]==0 但是vat[i]!=0,就必须升级一次
int countSum=0;
for(int i=0;i<bucket.size();i++)
{
if(bucket[i]==0 && vat[i]>0)
{
countSum++;
bucket[i]++;
}
}
//
vector<int> needCount(bucket.size(),0);
int minValue=9999999;
int count=0;
for(int ir=0;ir<10000;ir++)
{
int maxValue=0;
int maxi=0;
for(int i=0;i<bucket.size();i++)
{
if(bucket[i]>0)
{
needCount[i]=(vat[i]+bucket[i]-1)/bucket[i]; // 取最接近的整数
if(needCount[i]>maxValue)
{
maxValue=needCount[i];
maxi=i;
}
}
}
minValue=min(minValue,maxValue+count);
bucket[maxi]++;
count++;
}
return countSum+minValue;
}
};
里面考虑到了除数是0的情况和如何取整数的上界值,都是基础操作了。击败百分率有点拉胯。。
时间364 ms,击败5.19%
先这样吧,其他更高效的方法肯定是有的,比如这个循环次数太多了,每次都会重复计算。今天先学习到这里,明天继续。