Google APAC test 2015 Round B Problem B - New Years Eve

源题链接:

https://code.google.com/codejam/contest/4214486/dashboard#s=p1

题意:

年会上的有一座由酒杯一层一层叠起来的酒杯塔:每一层的酒杯编号如下:

Level 1: 
    1

Level 2:
    1
 2     3

Level 3:
      1
   2     3
4     5     6

Level 4:
         1
      2     3
   4     5     6
7     8     9     10
每一个非最底层的酒杯脚下有三个杯子支撑它。现在用B瓶750ml的酒从第一层那个酒杯开始注酒,当一个酒杯的酒满时,则溢出的酒平均溢到它脚下的三个酒杯。

比如第2层的编号为2的酒杯(250ml)酒满后,多余的酒就平均地溢出到第3层的2,4,5号酒杯。求B瓶酒倒完后第L层的第N个酒杯里有多少酒?


分析:

模拟酒一层一层往下溢出的方法,计算出每一层的每个酒杯里会流过多少酒(包括溢出的的和最后剩余在酒杯里的)

用二位数组left[][]记录第i层的每个杯子里流过的酒量,然后根据它生成第i+1层的对应的left[][](用tmp[][]暂存),递推关系如下:

tmp[j][k] = tmp[j][k] + max(float(left[j][k]-250)/3, 0)
tmp[j+1][k] = tmp[j+1][k] + max(float(left[j][k]-250)/3, 0)
tmp[j+1][k+1] = tmp[j+1][k+1] + max(float(left[j][k]-250)/3, 0)


代码:

from math import *
from bisect import *

def wine(B, L, N):
num = B*3
sum = 0

left = [ [750*B] ]
bis = [0]
for i in range(1, L):
tmp = [ [ 0 for ii in range(0, i+1)] for jj in range(0, i+1) ]
for j in range(0, i):
for k in range(0, j+1):
tmp[j][k] = tmp[j][k] + max(float(left[j][k]-250)/3, 0)
tmp[j+1][k] = tmp[j+1][k] + max(float(left[j][k]-250)/3, 0)
tmp[j+1][k+1] = tmp[j+1][k+1] + max(float(left[j][k]-250)/3, 0)
left = tmp
bis.append(i*(i+1)/2)
addr = bisect(bis, N-1)
return min(left[addr-1][N-1-(addr*(addr-1))/2], 250)


fin = open('b_large.in','r')
fout = open('b_large.out','w')

line = fin.readline()
n = int(line)

for i in range(0,n):
    line = fin.readline()
    line = line.split(' ')
    B = int(line[0])
    L = int(line[1])
    N = int(line[2])
    res = wine(B,L,N)
    fout.write("Case #%d: %.7f\n"%(i+1, res))

fin.close()
fout.close()




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值