这是我从老师那里获得的另一项任务。
杯子排列成树状结构,如下所示:
1
2 3
4 5 6
填充杯子1需要10秒钟,然后溢出到杯子2和3中。(假设没有溢出)。由于水流被分开,杯子2和3然后需要20秒才能填满。总之,通过将水倒入杯子1来填充杯子3,需要30秒。对于杯子5,它需要50秒,依此类推。
这是一张表格,其中包含正确的行和秒流体到达下一个杯子的值。
1(10)
2(30) 3(30)
4(70) 5(50) 6(70)
提出的问题是解决这个问题,对于一个行数为r的行,其边界为r <= 50: 鉴于行r和杯子c,该杯子需要多长时间才能填满?
我现在已经对这个问题进行了大约24小时的讨论,而且我并没有接近解决它。我知道这与Pascal的三角形和递归有关。我还想指出,这不是一个分级作业,而是一个老师提出的一个有问题的有趣问题。
编辑: 添加了一个更易于理解的数据结构以及我的笔记。
1: 1
2: 1 2
3: 1 2 3
鉴于这种结构,我已经发现根据下面的公式,水流分布到它下面的杯子的比例与帕斯卡的三角形相关
h(r,c)=P(n,c)/2^(n-1)
where P(n,c) returns the number contained in the according row in Pascal's triangle
然后我用它用以下公式计算秒数:
t(r,c)=(2^(n-1)/P(n,c))*10
前3行确实如此,但之后会因为从杯子上方2杯的水流不同时开始分离而崩溃。
我还尝试了一个递归函数来计算它的父项,它们位于(r-1,c)和(r-1,c-1)并应用前面的公式,但由于我的原因它是不正确的如上所述。
答案 0 :(得分:1)
此面试问题的答案在http://www.careercup.com/question?id=9820788和http://www.careercup.com/question?id=22191662上给出。
它也在http://www.geeksforgeeks.org/find-water-in-a-glass/,为了完整起见,这是我在评论中链接的相关SO质疑:Find the amount of water in ith cup in a pyramid structure?。
答案 1 :(得分:0)
这里可以使用动态编程找到解决方案的递归关系: -
if(T(r-1,c-1)<T(r,c)) {
T(r,c) = T(r-1,c) + (1-F(r-1,c)*(T(r-1,c)-T(r-1,c-1)))/(F(r-1,c-1)+F(r-1,c));
F(r,c) = F(r-1,c) + F(r-1,c-1);
}
else if(T(r-1,c)<T(r-1,c-1)) {
T(r,c) = T(r-1,c-1) + (1-F(r-1,c-1)*(T(r-1,c-1)-T(r-1,c)))/(F(r-1,c-1)+F(r-1,c));
F(r,c) = F(r-1,c) + F(r-1,c-1);
}
else {
T(r,c) = T(r-1,c-1) + 1/F(r-1,c-1);
F(r,c) = F(r-1,c-1);
}
for corner cases like
T(r,1) = T(r-1,1) + 2/F(r-1,1) and T(r,r) = T(r-1,r-1) + 2/F(r-1,r-1) and T(1,1) = 10
F(1,1) = 1/10
注意:我认为有一种可能的封闭形式但难以解决