【題目描述】
把乙個包含 n 個正整數的序列劃分為 m 個連續的子串行(每個正整數恰好屬於乙個序列)。設第 i 個序列的各數之和為 s(i),你的任務是讓所有 s(i)的最大值盡量小。例如序列 1 2 3 2 5 4 劃分成 3 個序列的最優方案為 1 2 3|2 5 |4,其中 s(1)、s(2)、s(3)分別為 6、7、4,最大值為 7;如果劃分成 1 2|3 2|5 4,則最大值為 9,不如剛才的好。n<=10^6,所有數之和不超過 10^9。
【輸入】
第一行輸入 n,m(1<=m<=n<=10^6)。接下來一行輸入 n 個正整數,每個數不超過 1000。
【輸出】
輸出答案。
【樣例輸入】
6 31 2 3 2 5 4
【樣例輸出】
【資料範圍】
30%的資料滿足:1<=m<=n<=500;
50%的資料滿足:1<=m<=n<=5000;
100%的資料滿足:1<=m<=n<=1000000。
***************=題解**********===
二分答案或動歸。
看到第一眼想到動歸,但是並不是很會寫,想打暴力來著,沒來得及。
動歸如果不優化會超時的。
以序列的最大元素為左端點,序列中的元素和為右端點,每次取區間中點,為每個子串行元素和的最大值,判斷函式是從第乙個元素開始加,當大於最大值時開另乙個子串行,如果序列數大於規定的數目而元素沒有放完那麼說明這個最大值太小,在右一半區間再二分。
最大值最小化
1 目標學會用猜數字 二分 的方法,換個角度來解決問題 2 include3 include 4 include5 const int n 100000 6 7int a n n,m,max 89 void input 1018 19 20bool is part int x 是否能把序列劃分為每個...
最大值最小化(maxmin)
分析 給定序列後,我們可以知道任意劃分的最大值的取值範圍 0,sum 1.n 一種較慢的方法是列舉每種取值情況,根據列舉值進行序列劃分,若劃分的組數大於m,說明沒有滿足條件的劃分情況,需要增加列舉值 如果劃分的組數小於m,說明找到了滿足條件的劃分情況。時間複雜度為o n sum 思路擴充套件 既然找...
最大值最小化(最大值盡量小)
from 給出是個序列,如1 2 3 2 5 4 將其劃分成m個連續的子串行,每個子串行最少有乙個元素,怎樣使每個子串行的和的最大值最小 include include using namespace std define n 10 define inf 1000 int juge int a,in...