问题描述可参考最大值最小化问题,问题在刘汝佳老师的算法竞赛入门经典书上的p151页,核心算法是二分法猜最大值,猜对了继续小化,猜错了增大数字,初始左值为序列第一个元素值,右值为序列和。
猜对:就是从右向左近尽量在满足<=x(x为猜测值)的条件下划分数组元素到一个子序列,同时要保证有给定的序列数(每个序列至少一个元素)
下面是我的C++实现代码
#include<iostream>
using namespace std;
#define N 1000000
int a[N];
int search_min(int n,int k)
{
int sum=0;
for (int i = 0; i < n; i++) sum += a[i];
int x = a[0], y = sum;
while (1)
{
int s = 0, sum = a[0], i;
int mid = x + (y - x) / 2,max,flag = 0;
for (i = 1; i < n; i++)
{
if (sum <= mid&&sum + a[i] > mid)
{
if (!flag){ flag = 1; max = sum; }
if (sum>max) max = sum;
sum = a[i]; s++;