问题描述
给你一个有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; }