#include<iostream>
using namespace std;
int m;
int find(int *a,int n,int lim)
{
int count=1;
int sum=0;
for(int i=0;i<n;i++)
{
if(a[i]>lim)
return INT_MAX;
else
{
sum+=a[i];
if(sum > lim)
{
sum=a[i];
count++;
}
}
}
return count;
}
int getmin(int *a,int n,int m)
{
if(a==NULL||n==0||m==0)
cout<<"error"<<endl;
int sum=0;
for(int i=0;i<n;i++)
sum+=a[i];
int min=0;
int max=sum;
while(min!=max-1)
{
int mid=(min+max)/2;
if(find(a,n,mid)>m)
min=mid;
else //find(a,n,mid) <= m
max=mid;
}
return max;
}
int main()
{
int a[]={3,2,4,5,2,7,1};
cin >> m;
cout<<getmin(a,7,m)<<endl;
system("pause");
return 0;
}
a[7] = {3,2,4,5,2,7,1},将其分成m段,每段的和为sum[i],求min(max(sum[i]));