感謝大佬的文章提供的思路,這道題理解起來有點難
沒有思路的話,看看著兩篇部落格挺有思路的
/*
大致題意:連續的資料分成m組 求最小組裡面的最大值(比如很多組中有兩個只有乙個資料的組 那麼誰大就是答案)
本質上是列舉 這裡的二分只是減小列舉的次數 好接下來看**
如何的得出答案:列舉乙個數 是否符合分成m組 根據計算得到的具體組和m的差距 在對邊界進行調整
假設mid為我們的正確答案 好好記住後面有用。。
*/#include
using
namespace std;
const
int n =
100010
;//因為n<=100000
int a[n]
;int n, m;
bool
er_fen
(int mid)}if
(cnt > m)
return
true
;//若求得的組數比m大 說明mid太小了才會導致頻繁的分組 在後面的二分中改變左端
else
return
false
;/*此時的cnt很可能等於m所以右端改變為mid 對答案再進行優化
或者小於m,也會將正確答案放在邊界內,繼續窮舉優化
做個有意思的假設:假設(假設!!!)第一次mid就為我們的正確答案,則右邊界一直等於答案直到二分結束輸出*/
}int
main()
int left = low;
int right = sum;
while
(left < right)
//本題的答案一定出現在最大值和總和之間
cout << left << endl;
}
poj 3273 二分列舉
題意 給出乙個有n個資料的陣列,將其分為連續的m份,找到一種分法,是的m份中最大乙份總和最小 參考部落格 題解 一種方案中最大的那部分總和num存在乙個範圍,num總大於等於陣列中最大的那個數,總小於等於整個陣列的和。得到了乙個範圍a b,用二分法不斷縮小範圍,比如第一次取mid a a b 2,那...
POJ 3273(二分,最小化最大值)
和這道題一樣了 description 聰哥在暑假參加了打零工的活動,這個活動分為n個工作日,每個工作日的工資為vi。有m個結算工錢的時間,聰哥可以自由安排這些時間,也就是說什麼時候拿錢,老闆說的不算,聰哥才有發言權!因為聰哥是土豪,他是老闆的老闆 聰哥不喜歡身上一次性有太多的錢,於是他想安排一下拿...
poj3273 poj3258 二分答案
二分答案的方法比較常用,思想比較簡單,就是從結果出發解決問題,已知答案在某乙個區間中,並且根據某種判定條件,能夠確定當前所選的值是大了還是小了,我們通過二分的方法將其找出來,從而降低時間複雜度。當然,這個判定條件就是二分答案的關鍵啦。通常,判定函式是乙個貪心演算法。二分答案的方法通常用來解決最小值最...