题意,n个数的数列,要分成 m+1 段,使每段数列和的最大值 最小。
求这个最小的和。
例:
输入:
5 2 //n,m
1 4 2 6 5 //数列,要分成m+1段
输出:
7
解析:分成 1 4 2 ,6 ,5 三段,每段和为 7,6,5.最大值为7。。此种分法的最大值 最小。
二分答案。。
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int p[100100];
int n,m;
int check(int a)
{
int i,sum=0,ans=0;
for(i=0;i<n;i++)
{
sum+=p[i];
if(sum>a)
{
sum=0;
ans++;
i--;
}
}
if(sum!=0)
{
if(sum>a)
ans+=2;
else
ans++;
}
return ans;
}
int main()
{
int i,j,k;
scanf("%d%d",&n,&m);
m++;
int mn=0;
for(i=0;i<n;i++){
scanf("%d",&p[i]);
mn=max(mn,p[i]);
}
int l=mn,r=1000000000;
while(l<r)
{
int mid=(r+l)/2;
int t=check(mid);
if(t<=m)
r=mid;
else
l=mid+1;
}
printf("%d\n",r);
}