二分最化最值問題 一

2022-03-22 19:06:43 字數 1144 閱讀 6760

把乙個包含n個正整數的序列劃分成m個連續的子串行(每個正整數恰好屬於乙個序列).

設i個序列的各數之和為s(i).你的任務是讓所有s(i)的最大值盡量小.

這個演算法很有現實意義.給你一堆亂七八糟的東西分堆,分出來的東西都不超過乙個固定的數值,這是需要技術含量的喔.

1.首先確定二分的上下界,這是每次二分必須做的準備工作.在這裡上限是這一堆東西的總量,下限是單個最大物品的值.

2.確定上下限之後開始二分.即判斷當前分堆是否合理,再判斷分堆是否合理中,主要限制因素為兩個,乙個是單堆的量肯定不能超過當前的mid值,另乙個是分出的堆數一定不能超過題目要求的m值.

3.由判斷條件即可將二分範圍進行縮小,即一旦當前mid值滿足分堆要求,意味著我還可以把mid值縮小(最小化),即把二分的right=mid,如果當前mid值觸犯了判斷條件,就把left=mid.

4.由以上二分return

的結果即為所求值.#includeusing namespace std;

const int n=1e5+5;

int a[n];

int ok(int m)

else sum+=a[i];

}return cnt <= m;

}int main()

int l=max,r=sum;

while(l<=r)

cout<

和最大化最小值問題正好相反,同樣用二分解決,差別主要在判斷條件.

1.最大化最小值(兼濟天下)

相當於把n個東西分給m個人,使得每個人至少拿x個,那麼每個人拿夠了就走,給後面的人多留一點,只要能分夠》=m個人就是true,多的全扔給最後乙個人就是了.

2.最小化最大值(獨善其身)

相當於n個東西分給m個人,每個人至多拿x個 ,那麼每個人盡可能拿多一點,給後面的人少留一點,只要能使<=m個人分完n個東西就是true,之後每個人隨便拿一點給沒有拿到的人就是了.

注意:1.關於初始值,有些題目直接給字首和,那樣最小值的最大值就是平均值,最大值的最小值也是平均值

對於可以計算sum的題有:

2.最大化最小值:

x為單點最小值,y為平均值.

3.最小化最大值:

x為平均值與單點最大值兩者中大的那乙個,y為sum.其實直接令x=0,y=0x7fffffff即可,不過迴圈32次而已...

最簡單的二分查詢

題目 描述 給定乙個排序 的整數陣列 公升序 和乙個要查詢的整數key,查詢到key第一次出現的下標 從0開始 並返回下標,如果key不存在於陣列中,返回 1。樣例 在陣列 1,2,3,3,4,5,10 中二分查詢3,返回2。二分查詢是演算法中非常重要的思想。正常情況下,我們在乙個陣列中查詢乙個數是...

最簡單的二分查詢

二分法屬於分治法的一種 對於已經從大到小排好序的陣列,從鍵盤中讀入乙個數,查詢陣列中有沒有和讀入資料相同的,有則輸出 yes 沒有則輸出 no 按照常規想法,迴圈陣列一遍進行比較,當陣列很大時效率低,採用二分,分而治之,講大問題轉化為小問題進行求解 遞迴方式實現 這裡遞迴就是自身呼叫自身的方式 in...

區間最值問題

實驗任務 已知乙個有 n 個數序列 a i 在序列 a 中的區間 l,r 中的最小值為 a p 求 a p a l a l 1 a r 的最大值為多少?資料輸入 第一行是乙個整數 n 第二行為 n 個整數對應 a i 對於 50 資料 1 n 5000 對於 100 資料 1 n 100 000 1...