二分 划分数列
問題描述
給你一個有n個正整數(shù)元素的數(shù)列,要求把它劃分成k段,使每段元素和的最大值最小 。 輸入第一行兩個正整數(shù)n,k,第二行為此數(shù)列ai輸出一行一個數(shù),為題目所求答案。
樣例輸入
5 2 2 1 3 4 5樣例輸出
9限制與約定
30%數(shù)據(jù) n <= 30, k <= 10
100%數(shù)據(jù) 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; }?
轉(zhuǎn)載于:https://www.cnblogs.com/hfang/p/11239869.html
總結