LCP 33. 蓄水(C++ 模拟法解决这道题目)

简单

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%

先这样吧,其他更高效的方法肯定是有的,比如这个循环次数太多了,每次都会重复计算。今天先学习到这里,明天继续。

猜你喜欢

转载自blog.csdn.net/weixin_41579872/article/details/127779642
今日推荐