我正在尝试制作最有效的算法来解决通信血管的问题。
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 :(得分: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 从最低容器的开放端离开系统。