这个问题取自interviewstreet.com
给定整数数组 Y=y1,...,yn,我们有 n 个线段,使得线段 i 的端点是 (i, 0) 和 (i, yi)。想象一下,从每个段的顶部向左发射一条水平射线,当它接触到另一个段或到达 y 轴时,这条射线停止。我们构造了一个由 n 个整数组成的数组,v1, ..., vn,其中 vi 等于从片段 i 的顶部射出的射线的长度。我们定义 V(y1, ..., yn) = v1 + ... + vn。
例如,如果我们有 Y=[3,2,5,3,3,4,1,2],那么 v1, ..., v8 = [1,1,3,1,1,3,1, 2],如下图所示:
对于 [1,...,n] 的每个排列 p,我们可以计算 V(yp1, ..., ypn)。如果我们选择 [1,...,n] 的均匀随机排列 p,那么 V(yp1, ..., ypn) 的期望值是多少?
输入格式
输入的第一行包含一个整数 T (1 <= T <= 100)。T 测试用例如下。
每个测试用例的第一行是一个整数 N (1 <= N <= 50)。下一行包含由单个空格分隔的正整数 y1, ..., yN (0 < yi <= 1000)。
输出格式
对于 V(yp1, ..., ypn) 的每个测试用例输出预期值,四舍五入到小数点后两位数。
样本输入
6 3 1 2 3 3 3 3 3 3 2 2 3 4 10 2 4 4 5 10 10 10 5 10 6 1 2 3 4 5 6
样本输出
4.33 3.00 4.00 6.00 5.80 11.15
解释
案例 1:我们有 V(1,2,3) = 1+2+3 = 6, V(1,3,2) = 1+2+1 = 4, V(2,1,3) = 1+ 1+3 = 5, V(2,3,1) = 1+2+1 = 4, V(3,1,2) = 1+1+2 = 4, V(3,2,1) = 1 +1+1 = 3。这些值的平均值为 4.33。
情况2:不管排列是什么,V(yp1, yp2, yp3) = 1+1+1 = 3,所以答案是3.00。
情况 3:V(y1 ,y2 ,y3)=V(y2 ,y1 ,y3) = 5, V(y1, y3, y2)=V(y2, y3, y1) = 4, V(y3, y1, y2 )=V(y3, y2, y1) = 3,这些值的平均值为 4.00。
对于 N=50,一个简单的问题解决方案将永远运行。我相信这个问题可以通过独立计算每根棍子的值来解决。我仍然需要知道是否有任何其他有效的方法来解决这个问题。我们必须在什么基础上独立计算每根棍子的价值?