1128 正整數分組 V2

2021-10-05 01:11:16 字數 1496 閱讀 9327

題目描述

給出乙個長度為n的正整數陣列,不改變陣列元素的順序,將這n個數分為k組。各組中元素的和分別為s1,s2…sk。如何分組,使得s1至sk中的最大值最小?

例如:1 2 3 4 5 6分為3組, ,元素和為6, 9, 6,最大值為9。也可以分為 。元素和為:10 5 6,最大值為10。因此第一種方案更優。並且第一種方案的最大值是所有方案中最小的。輸出這個最小的最大值。

輸入

第1行:2個數n, k,中間用空格分隔,n為陣列的長度,k為要分為多少組。(2 <= k < n <= 50000)

第2 - n + 1行:陣列元素(1 <= a[i] <= 10^9)

輸出

輸出這個最小的最大值。

輸入樣例

6 3123

456輸出樣例

9解題思路

1.首先明確,我們不可能進行列舉,否則會超時;

2.我們看到題目說是正整數,因此,我們可以放心的用二分,因為這樣我們才能保證,如果左邊都不滿足,那肯定都在右邊,這是要滿足二分中的單調性;

3.這題是經典的二分答案,我們用假設法來進行二分,假設此時的mid是所有分組中最大值的最小值,也就是二分所有和的上限,最終要求的就是最小上限;

4.我們將最初的右值,設為1e8,根據題目的值來設定,因此,我們總能找到最大值中的最小值;我們在這題中認為左值是不合法的,因此右值是合法的,所以最終的答案就在右值裡;

5.我們設乙個contseg函式,——這個函式的作用是:以mid為區間和的上限,最少能分成幾段;

6.我們將函式裡面的res設為切了幾刀,如果這個時候sum+a[i]>mid,我們就不得不切一刀,但是 res這個組數要預先+1 因為分組到最後, 還會剩一些數,但是不大於mid作為最後一組。

核心**

完整**

#include

using

namespace std;

long

long n,k,a[

50100];

long

long

contseg

(long

long x)

else

sum +

= a[i];}

return res +1;

// res這個組數要預先+1 因為分組到最後, 還會剩一些數,但是不大於x作為最後一組,假如進行到這的就是最後乙個,不也還剩下這個a[i]這段沒記進去嗎

}int

main()

cout << r << endl;

return0;

}

51nod 1128 正整數分組 V2

給出乙個長度為n的正整數陣列,不改變陣列元素的順序,將這n個數分為k組。各組中元素的和分別為s1,s2 sk。如何分組,使得s1至sk中的最大值最小?例如 1 2 3 4 5 6分為3組,元素和為6,9,6,最大值為9。也可以分為 元素和為 10 5 6,最大值為10。因此第一種方案更優。並且第一種...

51nod 1128 正整數分組 V2

給出乙個長度為n的正整數陣列,不改變陣列元素的順序,將這n個數分為k組。各組中元素的和分別為s1,s2.sk。如何分組,使得s1至sk中的最大值最小?例如 1 2 3 4 5 6分為3組,元素和為6,9,6,最大值為9。也可以分為 元素和為 10 5 6,最大值為10。因此第一種方案更優。並且第一種...

51nod 1128 正整數分組 V2(二分)

給出乙個長度為n的正整數陣列,不改變陣列元素的順序,將這n個數分為k組。各組中元素的和分別為s1,s2.sk。如何分組,使得s1至sk中的最大值最小?例如 1 2 3 4 5 6分為3組,元素和為6,9,6,最大值為9。也可以分為 元素和為 10 5 6,最大值為10。因此第一種方案更優。並且第一種...