碗堆高度
这个难题的目的是计算一堆碗的高度。
碗被定义为没有厚度的径向对称装置。它的轮廓形状是一个偶数多项式。堆栈由半径的列表描述,每个半径与一个偶数多项式关联,作为输入作为系数列表给出(例如,该列表3.1 4.2
代表多项式)。
多项式可以具有任意次数。为了简单起见,将堆的高度定义为最顶部碗的中心的高度(有关示例,请参见示例3的图)。
测试用例采用以下格式radius:coeff1 coeff2 ...
:每行以代表碗半径的浮点数开头,后跟冒号和空格分隔的列表,其中包含偶数幂的系数,以幂2开头(隐含零常数部分)。 。例如,该行2.3:3.1 4.2
描述了一碗半径2.3
和形状多项式3.1 * x^2 + 4.2 * x^4
。
例子1
42:3.141
描述一个零高度的堆,因为单个碗没有高度。
例子2
1:1 2
1.2:5
1:3
描述了一堆高度2.0
(请参见图)。
例子3
1:1.0
0.6:0.2
0.6:0.4
1.4:0.2
0.4:0 10
描述一堆高度为0.8的桩(请参见图中的绿色箭头)。
这是代码高尔夫,所以最短的代码获胜。
我有参考代码。
编辑:
参考实现依赖于一个库来计算多项式的根。您也可以这样做,但不必这样做。由于参考实现只是一个(非常好的)数值逼近,因此我将接受在普通浮点公差范围内能产生正确结果的任何代码。
这个难题的另一个变体是通过重新排序碗来最小化高度。我不确定是否有快速的解决方案(我想这很困难)。如果有人有更好的主意(或可以证明NP完整性),请告诉我!
is_maximum
应为return evaluate(differentiate(shape_0), root) > 0.0
。当前,它使用dd
(形状之间的差异的导数)求根,该值应始终返回0(对于根)。由于浮点误差,其结果是偶然正值接近为0,这就是为什么代码输出一个正确的或更准确的结果一些时间。检查1:0.2, 1:0.1 0.2
应输出的输入0.0125
0.801
。最后两个碗半径相碰0.1
。