二分 划分数列

时间:2022-12-19 15:31:22

问题描述

给你一个有n个正整数元素的数列,要求把它划分成k段,使每段元素和的最大值最小 。 输入第一行两个正整数n,k,第二行为此数列ai输出一行一个数,为题目所求答案。

样例输入

5 2
2 1 3 4 5

样例输出

9

限制与约定

30%数据 n <= 30, k <= 10

100%数据 n <= 100000, k <= n, 0<=ai <= 10^9

时间限制:1s

空间限制:128MB

#include <cstdio>
#include<iostream>
using namespace std;
int a[100001];
int n,k,r=0;
bool p(int ans) {
    int c=1;
    int temp=0;
    for (int i=1;i<=n;i++)
    if(temp+a[i]<=ans) temp+=a[i];
    else 
    {
        temp=a[i];
        c++;
    }
    return c<=k; 
}
int main() {

    cin>>n>>k;
    for (int i=1;i<=n;i++)
    {
        cin>>a[i];
        r+=a[i];
    }
    int l=1;
    while(l<r-1) 
    {
        int t=(l+r)>>1;
        if (p(t))  r=t;
        else l=t+1;
    }
    if (p(l)) cout<<l;
    else cout<<r;
    return 0;
}