我一看到这题,就立马想到了刘汝佳的《算法竞赛入门经典》中的最大值最小化问题。
#include<stdio.h>
int a[100000],n,m;
bool pan(int x)
{
int i=0,sum=0,count=1;
for(;i<n;)
if(sum+a[i]>x)
if(count<m)
{
sum=a[i++];
count++;
}
else
return false;
else sum+=a[i++];
return true;
}
int main()
{
freopen("t.txt","r",stdin);
int i,k,front,rear,mid;
while(scanf("%d%d",&n,&m)!=EOF)
{
rear=0;front=0;
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
rear+=a[i];
if(front<a[i])front=a[i];
}
while(front<rear)
{
mid=front+(rear-front)/2;
if(pan(mid))rear=mid;
else front=mid+1;
}
printf("%d\n",rear);
}
return 0;
}