【木材加工】

木材加工

木材加工

题意

需要将n根原木切割成k 段长度均为 l 的小段木头,求出 l 的最大值

思路

  1. 将n跟原木进行切割,要定义输出所需的值
  2. 用二分法去进行输出,定义好左右边界的值
  3. 输出 l 即可

需要注意定义时应用长整型去定义

实现步骤
  1. 先输入原木的数量,需要得到的小段的数量,判断总段数是否大于等于所需段数
  2. 输入数组判断是否大于最多段数,如果大于,就以最大段数为右边界
  3. 使用二分法的模板二进行二分法判断,即可得出答案
代码
#include
using namespace std;

const int N=1e5+10;
long long int a[N],n,k,sum,maxa;

int check(int mid)
{
        int sum=0;
        for(int i=1;i<=n;i++){
                sum+=a[i]/mid;
        }
        if(sum>=k) return 1; //总段数大于等于所需要的 
        return 0;
} 
int main(){
        cin>>n>>k;
        for(int i=1;i<=n;i++){
                cin>>a[i],sum+=a[i];
                if(a[i]>maxa) maxa=a[i];  
        }
        
        if(sum<k){cout<<0;return 0;} //先判断是否有解 
        
        int l=1,r=maxa;
        while(l<r) //模板2 
        {
                int mid=l+r+1>>1;
                if(check(mid)) l=mid; 
                else r=mid-1;
        }
        cout<<l;
        return 0;
}
 
 

总结

需掌握二分的两个模板进行套用

你可能感兴趣的:(算法)