poj 3273 二分列舉

2021-08-07 03:51:04 字數 1045 閱讀 2919

題意:給出乙個有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個結算工錢的時間,聰哥可以自由安排這些時間,也就是說什麼時候拿錢,老闆說的不算,聰哥才有發言權!因為聰哥是土豪,他是老闆的老闆 聰哥不喜歡身上一次性有太多的錢,於是他想安排一下拿...