題意:給定一列數,分成m段,使每段和的最大值最小。
考慮二分最小段和size,答案顯然滿足單調性。可以在每次check中累加數列元素判斷當前組的總和是否在size以內。由於序列元素均為非負整數,字首和陣列的值滿足非嚴格單調遞增,那麼可以在字首和上再套乙個二分來優化暴力累加的過程。
我不知道優化以後的複雜度怎麼分析,反正它跑的快多了
**:#include
#include
#define maxn 100010
using namespace std;
int a[maxn], n, m;
long long s[maxn];
bool div(int sum)
++cnt, i = l + 1;
} return cnt <= m;
} int main()
cout << l;
return 0;
}
P1182 數列分段 Section II(二分)
題目 對於給定的乙個長度為n的正整數數列 a1 na a1 n 現要將其分成 m m n 段,並要求每段連續,求每段和的最大值最小。solve 顯然的最大值最小化問題,用二分。列舉答案,列舉的範圍 只要從陣列中最大的那個數列舉到所有數的和就行了。include using namespace std...
二分答案 洛谷P1182 數列分段
將一段數列分成不超過 m m 的段,使得每段的最小的最大值 一般看到最小 最大 什麼的基本都用二分 因為最大值要盡量小,所以資料必然具有單調性,所以我們可以通過二分最大值 即最終答案 來求解。中間加上判斷即可 include using namespace std int l,r,mid,a 100...
洛谷P1182 數列分段(二分 貪心)
題目描述 對於給定的乙個長度為n的正整數數列 a a 1 n 現要將其分成 mm m leq nm n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列 4 2 4 5 14 2 4 5 1 要分成 33 段。將其如下分段 4 2 4 5 1 4 2 4 5 1 第一段和為 66...