林克被造的紀念日快要到了。根據任天堂公司的慣例,每年到這個時間都會一些蛋糕分給林克的朋友。這些蛋糕有不同的口味,比如南瓜蛋糕、堅果蛋糕、西瓜蛋糕、胡蘿蔔蛋糕、水果蛋糕等等(有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個朋友會來參加我的派對,每個人會拿到一塊派 必須乙個派的一塊,不能由幾個派的小塊拼成 可以是一整個派 我的朋友們都特別小氣,如果有人拿到更大的一...