演算法實踐 農夫和牛 (二分)

2021-10-03 21:19:02 字數 1455 閱讀 8744

農夫john建造了一座很長的畜欄,它包括n(2≤n≤100,000)個隔間,這些小隔間的位置為x0,…,xn-1(0≤xi≤1,000,000,000,均為整數,各不相同).

john的c(2≤c≤n)頭牛每頭分到乙個隔間。牛都希望互相離得遠點省得互相打擾。

怎樣才能使任意兩頭牛之間的最小距離盡可能的大,這個最大的最小距離是多少呢?

第1行: 兩個由空格分隔的整數 n,c

第2…n + 1行:第i + 1行包含整數隔間的位置xi。

第1行:乙個整數:最大最小距離

5 312

849

3
中等

首先對畜欄的位置進行排序,isok函式判斷以distance的距離存放是否能裝得下所有的牛,接著是乙個二分查詢的模板searchmaxd,對最大距離d進行二分查詢, 在[left,right]內用二分法查詢「最大最近距離」

left的起始值為0,right的其實值為最後乙個減第乙個(即最大距離)若d可行,則(left= mid+1)在右側繼續查詢,若d不可行,則(right = mid)在左邊查詢。

n =

(int)(

input()

)c =

(int)(

input()

)cow_stall =

for i in

range

(n):

(int)(

input()

))cow_stall.sort(

)def

isok

(distance)

: count =

1 tempstall = cow_stall[0]

for i in

range(1

,n):

if(cow_stall[i]

-tempstall>=distance)

: count +=

1 tempstall = cow_stall[i]

if(count>=c)

:return

true

else

:return

false

defsearchmaxd()

: left =

0 right = cow_stall[-1

]-cow_stall[0]

while

(left: mid =

(int)(

(left+right)/2

)if(isok(mid)):

left = mid+

1else

: right = mid

print

(mid)

searchmaxd(

)

演算法實踐 派 (二分)

林克被造的紀念日快要到了。根據任天堂公司的慣例,每年到這個時間都會一些蛋糕分給林克的朋友。這些蛋糕有不同的口味,比如南瓜蛋糕 堅果蛋糕 西瓜蛋糕 胡蘿蔔蛋糕 水果蛋糕等等 有n種不同口味,大小不同的蛋糕 為了公平,每個朋友都會分到一塊大小相同的蛋糕 不需要同樣形狀,但是要同一種口味,不允許混合口味,...

演算法實踐 704 二分查詢

給定乙個n個元素有序的 公升序 整型陣列nums和乙個目標值target,寫乙個函式搜尋nums中的target,如果目標值存在返回下標,否則返回 1。示例 1 輸入 nums 1,0,3,5,9,12 target 9輸出 4解釋 9 出現在 nums 中並且下標為 4示例 2 輸入 nums 1...

演算法實踐 月度開銷(二分)

農夫約翰是乙個精明的會計師。他意識到自己可能沒有足夠的錢來維持農場的運轉了。他計算出並記錄下了接下來n 1 n 100,000 天裡每天需要的開銷。約翰打算為連續的m 1 m n 個財政週期建立預算案,他把乙個財政週期命名為fajo月。每個fajo月包含一天或連續的多天,每天被恰好包含在乙個fajo...