寻找Under Water Town的算法

时间:2014-11-17 17:53:58

标签: algorithm greedy

假设城镇附近有一座大坝。大坝顶部有一个大洞,如下图所示。
city view

水以1平方米/秒的速度从这个洞出来,建筑物正在水下。 建筑屋顶长度为1米,高度为整数。 鉴于特定建筑物,我们必须计算建筑物在水面以下1米处的时间。

我正在寻找一种贪婪的算法来计算这个时间。

我想了几天,但我没有找到任何好主意。

1 个答案:

答案 0 :(得分:3)

据我所知,填充将如下: enter image description here

这是伪代码和描述中的算法:

1)int h[]成为房屋高度的数组。指数是房子的数量。所以数组的长度是我们考虑的x范围(或房屋数量)。如果在某个位置没有房子,则会有0(或高度为零的房屋)
float w[]为绝对水高,与h[]对应的数组 我的意思是w[i]-h[i] =第i个房子上方的水深 首先,我们应该:

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)在此步骤增加水高(flow - 是水流量):

for(j=0;j<=i;j++)
    if(w[j] == w[i])
        w[j] += flow / count;

5)x成为我们在水下等待1米的房子的索引。因此,我们决定实现目标还是应该返回步骤2):

if (w[x] - h[x] >= 1m)
    return; // we achieved the goal !!!
else
    repeat from step "2)"

注意
可以稍微优化代码。我认为,仍然采用这种形式,这是最清楚的。