51nod 1128 正整數分組 V2

2021-08-15 11:02:45 字數 1031 閱讀 1388

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

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

input

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

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

output

輸出這個最小的最大值。
input示例

6 312

3456

output示例

9
思路:

先計算出全部元素的和。然後以1為左端點,所有元素和為右端點,進行二分法,嘗試以中間值來分組,根據分組數與k比較來確定左右端點的移動。

#include #include using namespace std;

typedef long long ll;

const int maxn = 50010;

ll a[maxn];

ll k, n;

ll total = 0;

int group(ll key)

else if (sum + a[i] > key)

else

}return result;

}ll search(ll left, ll right)

else

}if (group(left) == k)

return right;

}int main()

cout << search(1, total);

return 0;

}

51nod 1128 正整數分組

1128 正整數分組 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 80 難度 5級演算法題 給出乙個長度為n的正整數陣列,不改變陣列元素的順序,將這n個數分為k組。各組中元素的和分別為s1,s2.sk。如何分組,使得s1至sk中的最大值最小?例如 1 2 3 4 5 6分為3組,...

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。因此第一種方案更優。並且第一種...