二分答案-木材加工
题目名字:木材加工
[题目链接](二分 - Virtual Judge (vjudge.net))
题意
给定n个原木,要求切割成k段长度均为l的木头
求l的最大值(都为整数)
思路
1.用check函数判断条件(是否满足所需段数)
2.先判断是否有解
3.因求最大值,所以用模板二找mid
算法一:二分
代码
#include
using namespace std;
const int N=1e5+10;
long long a[N],n,m,sum,maxa;
int check(int mid)
{
int sum=0;
for(int i=1;i<=n;i++){
sum+=a[i]/mid;
}
if(sum>=m) return 1; //总段数大于等于所需要的
return 0;//return 1是有结果,return 0是没有返回
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i],sum+=a[i];
if(a[i]>maxa) maxa=a[i];
}
if(sum<m){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;
}
总结
二分运行不会超时,方便简洁