用于通信船只的高效算法

时间:2013-11-10 09:51:26

标签: algorithm

我正在尝试制作最有效的算法来解决通信血管的问题。

Input:
Number of vessels (int, 1-200000)
For each vessel - altitude of vessel (int, can be negative)
                  height (int, >1)
                  width (int, >1)
                  depth (int, >1)
Volume of water (int >=0, read to EOF)

Output:
Altitude of water surface (double) or "Empty" or "Overflow"

我制作了一个程序(在C中),它使用二分法,但它有时没有给出正确的结果(fe容器1 1 1 1和3 3 3 3和容量1给出2.25而不是2.0,或溢出检测问题)。

所以我的算法是:

  • 读取值
  • 转换它们(altitude of bottom, altitude of top, area)
  • qsort (altitude of bottom)
  • SURFACE = (lowest + highest place)/2
  • 从底部到SURFACE
  • 计算音量
  • 体积是否等于所需体积(允许误差0.000001)?是大于还是小于所需的体积?
  • 如果更大,则采用下半部分并重复处理,如果较小则采取上限,保存计算量,重复处理。

我希望这是可以理解的。

有没有更好的方法来解决这个问题?或者如何改进我的方法?

输入图片:

image of input

1 个答案:

答案 0 :(得分:1)

如果我们在系统中使用相同的液体(因此容器中的液体密度相同) - 所有通信容器中的液位将是相同的。

第1步。让我们计算一些不变的参数:实验前的液体体积和最低水平:

之前的V = SUM(H i * W i ),其中H i 是容器中的高度i和W i 是容器i的宽度。

L 最低 = MIN(A i + D i ),其中A i 是船只的高度i和D i 是血管的深度

基本等式将是保存量的定律(在系统释放之前和之后):

> = V 之前的 + V 溢出

另外,必须满足以下明显条件:

V overflow &gt; 0如果L 结果&gt; →<子>最低

如果L 结果&lt; = L 最低

V 溢出 = 0

基于此,我们可以设置第一级,例如,之前的级别的算术平均值然后计算差异,检查V overflow ,如果不满足条件,则增加和降低水平并重申。

第2步。但我有另一个想法。让我们检查系统刚出现溢出时的情况:

V 溢出 = 0

L 结果 = L 最低

= SUM之后的((L 结果 - A i )* W i ),但是当然对于那些我在哪里(L 结果 - A i )&gt; 0因为显然容器不能容纳负量的液体。

结果我们将有三种可能的情况:

如果在之后 = V 之后的V ,那么我们正在寻找L result

如果在之后的V &gt;在之前的V ,然后没有发生溢出并且在容器之间发生简单的液体重新分配。因此,我们可以将结果级别计算为:

L 结果 = V / SUM(W i )之前,对于那些我在哪里(L result - i )&gt; 0

如果在之后的V &lt; 之前的V ,然后发生溢出,L 结果 = L 最低之前的差异V - 之后的V 从最低容器的开放端离开系统。