題意:給出乙個有n個資料的陣列,將其分為連續的m份,找到一種分法,是的m份中最大乙份總和最小
參考部落格:
題解:一種方案中最大的那部分總和num存在乙個範圍,num總大於等於陣列中最大的那個數,總小於等於整個陣列的和。得到了乙個範圍a~b,用二分法不斷縮小範圍,比如第一次取mid = a + (a - b) / 2, 那麼分組時候每組最大為mid,分到最後乙個得到的組數如果小於等於m那就將範圍縮小到a~mid,如果分得的組數大於m,那就將範圍縮小到mid~b,直到不能縮小了就能得到最優值了。
看網上說的是一般求最大值最小化或者最小值最大化用的就是二分,暫時還沒有做過其他例題,等找到了再來補充
此題**如下:
#include #include#include
using
namespace
std;
int a[100005];int
m, n;
int solve(int
x) }
k++;
returnk;}
intmain()
int lef = mi, rig =ma;
int ans = 0xffffff
;
while(lef <=rig)
else lef = mid + 1
; }
cout
<< ans <
return
0;
}
/*
d8tltanc的看法
這題有幾個 關鍵點
1. 二分的時候, 必須要是r=mid-1, l=mid+1, 不然會陷入死迴圈!如49 50 永遠都是會49 50
2. 二分的時候, 由於num==m的時候有很多種滿足的情況, 所以並且由於1中的 r=mid-1, l=mid+1,會使mid==ans時, mid又被+1或者-1,然後進入下步搜尋。 所以, 應該用ans=min(ans,mid), 而不能直接cout《mid。很多認得程式都是直接cout了。*/
poj3273(二分)詳細題解
感謝大佬的文章提供的思路,這道題理解起來有點難 沒有思路的話,看看著兩篇部落格挺有思路的 大致題意 連續的資料分成m組 求最小組裡面的最大值 比如很多組中有兩個只有乙個資料的組 那麼誰大就是答案 本質上是列舉 這裡的二分只是減小列舉的次數 好接下來看 如何的得出答案 列舉乙個數 是否符合分成m組 根...
瘋牛(二分列舉)
描述 農夫 john 建造了一座很長的畜欄,它包括n 2 n 100,000 個隔間,這些小隔間依次編號為x1,xn 0 xi 1,000,000,000 但是,john的c 2 c n 頭牛們並不喜歡這種布局,而且幾頭牛放在乙個隔間裡,他們就要發生爭鬥。為了不讓牛互相傷害。john決定自己給牛分配...
POJ 3273(二分,最小化最大值)
和這道題一樣了 description 聰哥在暑假參加了打零工的活動,這個活動分為n個工作日,每個工作日的工資為vi。有m個結算工錢的時間,聰哥可以自由安排這些時間,也就是說什麼時候拿錢,老闆說的不算,聰哥才有發言權!因為聰哥是土豪,他是老闆的老闆 聰哥不喜歡身上一次性有太多的錢,於是他想安排一下拿...