from math import floor, ceil, modf
target =
max_k = 10.0
def compute_avg(list):
if len(list) == 0:
return 0
sum = reduce(lambda i, j: i + j, list)
return round(float(sum) / len(list), 2)
def generate_list(target, n, m):
result = [target + 1 for i in range(0, n)]
map(lambda x: result.append(target), range(0, m))
return result
def round_approximation(n, m):
(decn, intn) = modf(n)
(decm, intm) = modf(m)
return (int(ceil(n)), int(floor(m))) if decn > decm else (int(floor(n)), int(ceil(m)))
def inverse_avg(target, n, m):
res = generate_list(target, n, m)
avg = compute_avg(res)
return (avg, res)
def sort_attempts(x, y):
dx = abs(target - x['average'])
dy = abs(target - y['average'])
if dx > dy:
return 1
elif dx == dy:
return 0
else:
return -1
(decimal, integer) = modf(target)
decimal = round(decimal, 2)
k = 1
while k < 100:
x = decimal * k
if x == int(x):
break
k += 1
(n, m) = (int(x), int(ceil(k-x)))
if k > max_k:
"""
n/k = n'/10
m/k = m'/10
n' = 10n/k
m' = 10m/k
"""
attempts = []
for i in range(1, 10):
(t_n, t_m) = ((i*n)/(n+m), (i*m)/(n+m))
(t_n, t_m) = round_approximation(t_n, t_m)
(avg, elements) = inverse_avg(int(target), t_n, t_m)
attempts.append({'average': avg, 'n': t_n, 'm': t_m})
attempts.sort(sort_attempts)
winner = attempts[0]
print inverse_avg(int(target), winner['n'], winner['m'])
else:
print inverse_avg(int(target), n, m)
ZnJvbSBtYXRoIGltcG9ydCBmbG9vciwgY2VpbCwgbW9kZgoKdGFyZ2V0ID0gCm1heF9rID0gMTAuMAoKZGVmIGNvbXB1dGVfYXZnKGxpc3QpOgoJaWYgbGVuKGxpc3QpID09IDA6CgkJcmV0dXJuIDAKCXN1bSA9IHJlZHVjZShsYW1iZGEgaSwgajogaSArIGosIGxpc3QpCglyZXR1cm4gcm91bmQoZmxvYXQoc3VtKSAvIGxlbihsaXN0KSwgMikKCmRlZiBnZW5lcmF0ZV9saXN0KHRhcmdldCwgbiwgbSk6CglyZXN1bHQgPSBbdGFyZ2V0ICsgMSBmb3IgaSBpbiByYW5nZSgwLCBuKV0KCW1hcChsYW1iZGEgeDogcmVzdWx0LmFwcGVuZCh0YXJnZXQpLCByYW5nZSgwLCBtKSkKCglyZXR1cm4gcmVzdWx0CgpkZWYgcm91bmRfYXBwcm94aW1hdGlvbihuLCBtKToKCShkZWNuLCBpbnRuKSA9IG1vZGYobikKCShkZWNtLCBpbnRtKSA9IG1vZGYobSkKCglyZXR1cm4gKGludChjZWlsKG4pKSwgaW50KGZsb29yKG0pKSkgaWYgZGVjbiA+IGRlY20gZWxzZSAoaW50KGZsb29yKG4pKSwgaW50KGNlaWwobSkpKQoKZGVmIGludmVyc2VfYXZnKHRhcmdldCwgbiwgbSk6CglyZXMgPSBnZW5lcmF0ZV9saXN0KHRhcmdldCwgbiwgbSkKCWF2ZyA9IGNvbXB1dGVfYXZnKHJlcykKCglyZXR1cm4gKGF2ZywgcmVzKQoKZGVmIHNvcnRfYXR0ZW1wdHMoeCwgeSk6CglkeCA9IGFicyh0YXJnZXQgLSB4WydhdmVyYWdlJ10pCglkeSA9IGFicyh0YXJnZXQgLSB5WydhdmVyYWdlJ10pCgoJaWYgZHggPiBkeToKCQlyZXR1cm4gMQoJZWxpZiBkeCA9PSBkeToKCQlyZXR1cm4gMAoJZWxzZToKCQlyZXR1cm4gLTEKCihkZWNpbWFsLCBpbnRlZ2VyKSA9IG1vZGYodGFyZ2V0KQpkZWNpbWFsID0gcm91bmQoZGVjaW1hbCwgMikKayA9IDEKCndoaWxlIGsgPCAxMDA6Cgl4ID0gZGVjaW1hbCAqIGsKCWlmIHggPT0gaW50KHgpOgoJCWJyZWFrCglrICs9IDEKCihuLCBtKSA9IChpbnQoeCksIGludChjZWlsKGsteCkpKQppZiBrID4gbWF4X2s6CgkiIiIKCQluL2sgPSBuJy8xMAoJCW0vayA9IG0nLzEwCgoJCW4nID0gMTBuL2sKCQltJyA9IDEwbS9rCgkiIiIKCWF0dGVtcHRzID0gW10KCglmb3IgaSBpbiByYW5nZSgxLCAxMCk6CgkJKHRfbiwgdF9tKSA9ICgoaSpuKS8obittKSwgKGkqbSkvKG4rbSkpCgkJKHRfbiwgdF9tKSA9IHJvdW5kX2FwcHJveGltYXRpb24odF9uLCB0X20pCgoJCShhdmcsIGVsZW1lbnRzKSA9IGludmVyc2VfYXZnKGludCh0YXJnZXQpLCB0X24sIHRfbSkKCQlhdHRlbXB0cy5hcHBlbmQoeydhdmVyYWdlJzogYXZnLCAnbic6IHRfbiwgJ20nOiB0X219KQoKCWF0dGVtcHRzLnNvcnQoc29ydF9hdHRlbXB0cykKCXdpbm5lciA9IGF0dGVtcHRzWzBdCgoJcHJpbnQgaW52ZXJzZV9hdmcoaW50KHRhcmdldCksIHdpbm5lclsnbiddLCB3aW5uZXJbJ20nXSkKZWxzZToKCXByaW50IGludmVyc2VfYXZnKGludCh0YXJnZXQpLCBuLCBtKQ==