P1182 數列分段 Section II

2022-04-29 03:12:10 字數 912 閱讀 3179

求數列每段和的最大值的最小值,很明顯是用二分法求解,加貪心檢驗。本題關鍵是要怎麼去高效的check,可以考慮乙個貪心的思路,能加的就加上,不能則新開一段,so對於二分的值 u ,我們從數列 sum 從前往後掃,如果 tot 大於了 u ,我們不加而是 tot 重新賦值並且 cnt++ ,最後只需判斷 cnt 是否不小於 m 就行了。這樣判斷與字首和一樣是o(n)的複雜度,但是節省了空間且容易思考。

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 100005

intsum[maxn],tot,n,m,l,r,mid,cnt;

inline

intread()

while

(isdigit(ls))

return kr*xs;

}inline

int lck(int a,int

b)inline

int check(int

u)

return cnt>=m;

}int

main()

while(l<=r)

printf(

"%d\n

",l);

return0;

}

注意:二分時的區間取值問題,很明顯,對於l的賦值應該取數列中的最大值,而r應該取數列的總和。

P1182 數列分段Section II

二分答案 確定左邊界和右邊界後找中間值,驗證該值是不是不滿足 要找到滿足中最小的那個 不如說是找到不能滿足的最大的那個 1 主要是怎麼寫好judge函式。將數列在保證分段和不超過mid的情況下 盡可能使得段數最少 如果最少段數超過了m,說明滿足最大值最小的 ans 一定比該二分答案大,也就是說mid...

P1182 數列分段 Section II

對於給定的乙個長度為n的正整數數列a ia i,現要將其分成m m n m m n 段,並要求每段連續,且每段和的最大值最小。關於最大值最小 例如一數列4 2 4 5 142451要分成33段 將其如下分段 4 2 4 5 1 42 45 1 第一段和為66,第22段和為99,第33段和為11,和最...

P1182 數列分段 Section II

求最小值的最大,最大值的最小,考慮二分 對於給定的乙個長度為n的正整數數列a i,現要將其分成m m n 段,並要求每段連續,且每段和的最大值最小。輸入格式 第1行包含兩個正整數n,m。第2行包含nn個空格隔開的非負整數a,含義如題目所述。輸出格式 乙個正整數,即每段和最大值最小為多少。輸入樣例 1...