P1182 數列分段 Section II

2022-06-02 04:30:10 字數 840 閱讀 8961

題意:給出n個數字,要求分成連續的m段,使每段的和的最大值最小

思路:我們可以列舉這個最小的最大值,假如不滿足就向右二分,滿足就向左二分

那麼判斷條件是什麼呢?

顯然是按這個我們列舉的mid(就是我們在列舉的最大值)進行劃分,看看會分出多少個區間段來

假如大於,則不滿足,小於等於則滿足

但是,有一種情況需要注意:就是按我**裡的做法,當出現乙個數就大於我們列舉的最大值的時候

就會有問題,所有需要特判

**如下

1 #include2

using

namespace

std;

3const

int maxn=1e5+10;4

const

int inf=0x3f3f3f3f;5

inta[maxn];

6int

n,limit;

7int check(int

mid)818

}19if(sum) cnt++;

20if(cnt>limit) return0;

21else

return1;

22}23int

main()

2429

int l=0;30

int r=inf; //

先定義範圍

31int

ans;

32while(l<=r)

38else41}

42 printf("

%d\n

",ans);

43return0;

44 }

view code

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...