Pythonで理解する蟻本「3-1 平均最大化」(p.132)
この記事は「プログラミングコンテストチャレンジブック第2版」(蟻本)の
「3-1 平均最大化」(p.132)
のコードをPythonで書き直したものとなっています。
入力
入力例
3 2
2 2
5 3
2 1
解答
INF = 10 ** 6 + 1
# 入力
n, k = map(int,input().split())
w = [None] * n
v = [None] * n
for i in range(n):
w[i], v[i] = map(int,input().split())
y = [None] * n # v - x * w
# 条件を満たすか判定
def C(x):
for i in range(n):
y[i] = v[i] - x * w[i]
y.sort()
# yの大きいほうからk個の和を計算
sum = 0
for i in range(k):
sum += y[n - i - 1]
return sum >= 0
lb = 0
ub = INF
for i in range(100):
mid = (lb + ub) / 2
if C(mid):
lb = mid
else:
ub = mid
print(ub)