题目大意:金字塔形的杯子排列,由最上面的杯子开始灌水,水在灌满杯子后,溢出的水会均匀流到脚下的两个杯子中。给定灌水量和由i,j 确定的杯子的位置,求这个杯子的灌水量。
题目分析:给定了杯子的坐标,只要由上到下依次求出和这个杯子有关的杯子的灌水量即可,放在边缘的杯子只有一个水源,而放在里面的杯子有两个水源。
AC code:(Ruby)
def champagne_tower(poured, query_row, query_glass)
poured, ri, rj = [poured.to_f, query_row, query_glass]
cups = Array.new(ri + 1){Array.new(rj + 1, 0.0)}
diff = ri - rj
max = ->(a, b){a > b ? a : b}
min = ->(a, b){a < b ? a : b}
get_from_upper = ->(p){max.(p - 1, 0) / 2}
(0..ri).each {|i|
if i <= diff then 0..min.(i, rj) else (i - diff)..min.(i, rj)
end.each {|j|
cups[i][j] =
case
when i == 0 && j == 0
poured
when j == 0
get_from_upper.(cups[i - 1][j])
when j == i
get_from_upper.(cups[i - 1][j - 1])
else
get_from_upper.(cups[i - 1][j - 1]) + get_from_upper.(cups[i - 1][j])
end
}
}
min.(cups[ri][rj], 1.0)
end
本文介绍了一种解决金字塔形杯子灌水问题的算法。该算法通过递归地计算每个杯子的灌水量来确定特定位置杯子的水量。采用Ruby语言实现,并详细解释了算法的工作原理。
360

被折叠的 条评论
为什么被折叠?



