演算法實踐 派 (二分)

2021-10-03 21:23:09 字數 1825 閱讀 2072

林克被造的紀念日快要到了。根據任天堂公司的慣例,每年到這個時間都會一些蛋糕分給林克的朋友。這些蛋糕有不同的口味,比如南瓜蛋糕、堅果蛋糕、西瓜蛋糕、胡蘿蔔蛋糕、水果蛋糕等等(有n種不同口味,大小不同的蛋糕)。

為了公平,每個朋友都會分到一塊大小相同的蛋糕(不需要同樣形狀,但是要同一種口味,不允許混合口味,否則就會變成奇怪的菜餚)。

假設每個蛋糕都是乙個高為1,半徑不等的圓柱體,一共有f+1個人(f是林克的朋友個數,還要加上林克的設計者)。

所有人拿到的蛋糕是同樣大小的,請問每個人拿到的蛋糕最大是多少?

第一行包含兩個正整數n和f,1 ≤ n, f ≤ 10 000,表示蛋糕的數量和朋友的數量。

第二行包含n個1到10000之間的整數,表示每個蛋糕的半徑。

輸出每個人能得到的最大的蛋糕的體積,精確到小數點後三位。

3 3

4 3 3

25.133
中等

首先對蛋糕的大小進行排序,對沒人能得到的最大蛋糕體積進行二分查詢,查詢區間為left = 最小蛋糕體積/該分的人數,right = 最大蛋糕體積。

hasenoughcake函式用於判斷蛋糕是否夠分,如果不夠分,right = mid, 如果夠分,left = mid +eps 。eps為乙個很小的數。

需要注意最後的輸出格式和pi的精度。

import math

# 輸入

x =input()

x = x.split(

' ')

n =(

int)

(x[0])

f =(

int)

(x[1])

+1#多乙個設計者

y =input()

.split(

' ')

cake =

eps =1e-

6for i in

range

(n):

(int

)(y[i])**

2*math.pi)

cake.sort(reverse =

true

)def

hasenoughcake

(size):if

(size:return

true

count =

0for i in

range

(len

(cake)):

if(cake[i]

:continue

elif

(cake[i]

>=size)

: pieces =

(int

)(cake[i]

/size)

count += pieces

if(count>=f)

:return

true

else

:return

false

defbinarysearch()

: left = cake[-1

]/fright = cake[0]

while

(left: mid =

(left+right)/2

if(hasenoughcake(mid)):

left = mid + eps

else

: right = mid

return left

ans = binarysearch(

)print

("%.3lf"

%ans)

演算法實踐 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...

openjudge 派 二分查詢

05 派 總時間限制 1000ms 記憶體限制 65536kb 描述 我的生日要到了!根據習俗,我需要將一些派分給大家。我有n個不同口味 不同大小的派。有f個朋友會來參加我的派對,每個人會拿到一塊派 必須乙個派的一塊,不能由幾個派的小塊拼成 可以是一整個派 我的朋友們都特別小氣,如果有人拿到更大的一...