#include<iostream>
using namespace std;
__int64 n,k;
int a[100010];
bool f(__int64 mid) //怎么判断我没有想出来,是百度的
{
__int64 temp=0,max=0,sum,j;
while(temp<n)
{
sum=0;
for(j=temp;j<n;j++)
{
sum+=a[j];
if(sum>mid)
{
temp=j;
max++;
break;
}
}
if(j==n)
{
max++;
break;
}
}
if(max<=k)
return true;
else
return false;
}
int main()
{
__int64 i,left,right,sum=0,max=0,result,mid;
scanf("%I64d %I64d",&n,&k);
for(i=0;i<n;i++)
cin>>a[i];
for(i=0;i<n;i++)
sum+=a[i];
for(i=0;i<n;i++)
{
if(a[i]>max)
max=a[i];
}
left=max;right=sum;
while(left<=right)
{
mid=(left+right)/2;
if(f(mid))
{
result=mid;
right=mid-1;
}
else
left=mid+1;
}
printf("%I64d\n",result);
}
poj 3273 二分
最新推荐文章于 2020-04-14 09:36:57 发布