leetcode 2861最大合金数

这道题应该是用二分来进行解决的,因为它的样例在时间上给你限制了,导致不能使用比较暴力的解法。

如果这是OI赛制,你大可以写暴力拿分,这里作者就介绍一下暴力的写法:

思路:其实不难,读懂题目就知道,暴力解法就是个枚举的过程,把每个机器能够创造出的最大合金量算出来就行。首先外循环就是枚举机器数量,其次就是判断预算够不够的问题,那么就是预算够开始循环,预算不够退出循环,这是二重循环,三重循环就是遍历金属的种类,然后再计算就行。

注意:这里用了一个vector容器,是用来储存stock的,因为如果对stock本身进行更新,那么就会影响到下一台机器的计算了,所以需要有一个复制品代替它进行更新。

下面是暴力解法的代码(在leetcode给的730个样例里面过去了714个,剩下的16个样例是时间超时问题,但是结果是对的,便于题目的理解,建议先用暴力强化一下对于题目的理解,再深入去优化让时间复杂度减少):

class Solution {
public:
    int maxNumberOfAlloys(int n, int k, int budget, vector>& composition, vector& stock, vector& cost) {
        int count;
        int num;
        int maxs=0;
        for(int i=0;ibeiyong(stock);
            while(count=composition[i][j]){
                        beiyong[j]-=composition[i][j];
                    }
                    else{
                        int sheng=composition[i][j]-beiyong[j];
                        beiyong[j]=0;
                        count+=sheng*cost[j];
                    }
            }
            if(count<=budget)
            num++;
            }
            maxs=max(num,maxs);
        }
        return maxs;
    }
};

接下来就开始说二分查找的问题了。其实读者并没有想到用二分查找去做,后来暴力解了之后才知道用二分进行解。那么就说说思路吧:

使用这种二分查找,使用了假设的逻辑思维方式,假设我们知道它最大能做x块金属,那么我们就可以在它的数据范围之内进行二分查找,直到找到x为止。其实这里的x也是一个范围而已,实际上还是需要我们去遍历操作判断,只不过用二分查找的想法会更快一点,本题其实就可以直接考枚举也是行的。

我们等到二分到中间位置的时候需要判断它是否满足条件的时候,这个时候需要用到题目中的预算限制条件,所以就开始判断预算,储存量的关系是否在当前的费用内符合符合的话就照着这个缩小范围;不符合也可以缩小范围,只不过是两部分选哪一部分的问题而已。

上代码:

class Solution {
public:
    int maxNumberOfAlloys(int n, int k, int budget, vector>& composition, vector& stock, vector& cost) {
        int count;
        int num;
        int maxs=0;
        int i,j;
       int left=1;
       int right=2e8;//根据数据范围来定的
       int res=0;
       while(left<=right){
           int mid=(left+right)/2;
           bool valid=false;
           for(i=0;i(composition[i][j])*mid-stock[j],0LL)*cost[j];//这里的0LL指的是类型为long long的0,static_cast<>()是强制转换函数,C++库里面的
               }
               if(count<=budget){
                   valid=true;
                   break;
               }
           }
           if(valid){
               res=mid;
               left=mid+1;
           }
           else
           right=mid-1;
       }
       return res;
    }
};

你可能感兴趣的:(leetcode,算法,c++)