假设在城镇附近有一座水坝,水坝顶部有一个大洞,如下图所示。
水正以1平方米/秒的速度从这个洞里流出,建筑物都在水下。
建筑物屋顶长度为1米,高度为整数。
给定一个特定的建筑物,我们必须计算出该建筑物在水面以下1米处的时间。
我在寻找一个贪婪的算法来计算这一次。
我想了几天,但没找到好主意。

最佳答案

据我所知,填充过程如下:
下面是伪码算法和说明:
1)让int h[]与房屋高度排列。索引是房子的数目。所以数组的长度是x范围,我们要考虑(或房屋数量)如果某个位置没有房子,则会有0(或零高度的房子)
float w[]为绝对水深与h[]相对应的数组。
我的意思是我的房子上面的水深
所以首先我们应该:

copy elements from h[] to w[]

步骤2)并进一步执行每个程序计算步骤(比如1秒)
2)查找本地最小值的最后一个索引(从左侧开始):
i=0;
while(w[i+1]<=w[i]){
    i++;
    if(i == w.length-1)
        break; // or next step will violate array boundaries
}

3)计算有多少房屋+水位等于当地最低水位
count = 0;
for(j=0;j<=i;j++)
    if(w[j] == w[i])
        count++;

4)在此台阶上增加水位(w[i]-h[i]-为水流):
for(j=0;j<=i;j++)
    if(w[j] == w[i])
        w[j] += flow / count;

5)让flow作为我们等待在水下1米的房子的索引。因此,决定我们是实现了目标,还是应该回到步骤2):
if (w[x] - h[x] >= 1m)
    return; // we achieved the goal !!!
else
    repeat from step "2)"

注意
可以稍微优化一下代码我想,仍然是这样,这是最清楚的。

关于algorithm - 寻找水下小镇的算法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26978798/

10-13 01:18