二段性:如果對於乙個值x,存在一種m分段方法,能使得分段中的最大值滿足\(\le x\)那麼所有大於等於x的值t都存在m分段的方法使得分段最大值小於等於t。
題目要求分段最大值的最小值,所以可以用二分。
檢查乙個x值,能不能通過分m個段達到分段最大值\(\le x\), 這個用貪心來做,讓每乙個分段盡可能大,並且小於等於x,得到分段數的最小值cnt,再比較cnt和m的大小,如果cnt <= m則滿足。
複雜度:\(o(nlog(1e9)) = o(n), n \le 10^5\)
#includeusing namespace std;
const int n = 100010;
#define ll long long
int n, m;
int a[n];
int check(int x)
}return cnt <= m;
}int main()
cout << l << endl;
return 0;
}
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...