假设城镇附近有一座大坝。大坝顶部有一个大洞,如下图所示。
水以1平方米/秒的速度从这个洞出来,建筑物正在水下。 建筑屋顶长度为1米,高度为整数。 鉴于特定建筑物,我们必须计算建筑物在水面以下1米处的时间。
我正在寻找一种贪婪的算法来计算这个时间。
我想了几天,但我没有找到任何好主意。
答案 0 :(得分:3)
据我所知,填充将如下:
这是伪代码和描述中的算法:
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)"
注意强>
可以稍微优化代码。我认为,仍然采用这种形式,这是最清楚的。