二分法板子题
直接上代码:
int x[100005];
int m,n;
bool find(int y)
{
int tmp=0;
int cnt=1;//这里容易出错,最少有一个
for(int i=0;i<n;++i)
{
if(x[i]>y)
return 0;
if(x[i]+tmp<=y)
{
tmp+=x[i];
}
else
{
tmp=x[i];
cnt++;
}
}
if(cnt>m)
return 0;
else
return 1;
}
int main()
{
while(cin>>n>>m)
{
int l=0,r=0;
for(int i=0;i<n;++i)
{
cin>>x[i];
l=max(l,x[i]);
r+=x[i];
}
int res;//甜酱写法
while(l<=r)
{
int mid=(l+r)/2;
if(find(mid))
{
r=mid-1;
res=mid;
}
else
{
l=mid+1;
}
}
cout<<res<<endl;
}
system("pause");
return 0;
}