木材加工
2026-02-07 19:55:03
发布于:浙江
3阅读
0回复
0点赞
这道题用二分答案来做:
begin为最小分段长度(即为0)
end为最大分段长度(即为木段长度总和/分段数)
mid为中间值
注意!:当找到符合条件的值后要继续寻找最优解(即符合条件的最大分段长度)
以样例为例:
当值为102时,232/102+124/102+456/102总段数也为7,
需继续寻找,最终值为114
#include <bits/stdc++.h>
using namespace std;
long long n,k;
long long w[1000010];
int ww(int l)
{
if(l==0)
{
return 0;
}
int r=0;
for(int i=1;i<=n;i++)
{
r+=w[i]/l;
}
return r;
}
int main()
{
cin>>n>>k;
long long sum=0;
for(int i=1;i<=n;i++)
{
cin>>w[i];
sum+=w[i];
}
long long beginn=0,mid=0,endd=sum/k;
long long ans=0;
while(beginn<=endd)
{
mid=(beginn+endd)/2;
int r=ww(mid);
if(r>=k)
{
ans=max(ans,mid);
beginn=mid+1;
}
else
{
endd=mid-1;
}
}
cout<<ans<<endl;
return 0;
}
这里空空如也







有帮助,赞一个