Algorithm 如何应对垂直杆挑战?
这个问题来源于 给定整数数组Y=y1,…,yn,我们有n条线段 线段i的端点为(i,0)和(i,yi)。想象一下,从 在每一段的顶部,一条水平光线被投射到左侧,而这条光线 当它接触到另一段或碰到y轴时停止。我们 构造一个由n个整数v1,…,vn组成的数组,其中vi等于 从段i顶部拍摄的射线长度。我们定义V(y1,…,yn) =v1+…+越南 例如,如果我们有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)的预期值是多少 输入格式Algorithm 如何应对垂直杆挑战?,algorithm,data-structures,probability,Algorithm,Data Structures,Probability,这个问题来源于 给定整数数组Y=y1,…,yn,我们有n条线段 线段i的端点为(i,0)和(i,yi)。想象一下,从 在每一段的顶部,一条水平光线被投射到左侧,而这条光线 当它接触到另一段或碰到y轴时停止。我们 构造一个由n个整数v1,…,vn组成的数组,其中vi等于 从段i顶部拍摄的射线长度。我们定义V(y1,…,yn) =v1+…+越南 例如,如果我们有Y=[3,2,5,3,3,4,1,2],那么v1,…,v8= [1,1,3,1,1,3,1,2],如下图所示: 对于[1,…,n]的每个置
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
输入的第一行包含一个整数T(1,正如您正确指出的,我们可以独立地解决每个棒的问题 设F(i,len)是排列数,来自棒i的光线正好是len。
那么答案是 (总和(由i,len)F(i,len)*len)/(n!) 剩下的就是计算F(i,len),设a(i)为棒数j,即y_jb_i 为了得到长度为len的光线,我们需要这样的情况
B, l...l, O
len-1 times
式中,O-表示棍子,i.B-表示棍子的长度较大,或开头较大。l-表示棍子的高度,小于ith
这给了我们两种情况:1) B是开始,这可以通过
P(a(i),len-1)*(B(i)+a(i)-(len-1))实现代码>方式。
2) B是更大的棒,这可以通过P(a(i),len-1)*B(i)*(B(i)+a(i)-len)实现*(n-len)
方式
编辑:在(mul)中将b(i)改为第二项,以代替案例2中的a(i)。如您所知,我们可以独立解决每个斗杆的问题
设F(i,len)是排列数,来自棒i的光线正好是len。
那么答案是
(总和(由i,len)F(i,len)*len)/(n!)
剩下的就是数F(i,len)。设a(i)为棒数j,即y_jb_i
为了得到长度为len的光线,我们需要这样的情况
B, l...l, O
len-1 times
其中O-是stick#i。B-是指长度较大的棍子,或是开头较大的棍子。l-是指粘着高度,小于ith
这给了我们两种情况:
1) B是开始,这可以通过P(a(i),len-1)*(B(i)+a(i)-(len-1))实现代码>方式。
2) B是更大的棒,这可以通过P(a(i),len-1)*B(i)*(B(i)+a(i)-len)实现*(n-len)
方式
编辑:在(mul)中将b(i)改为第二项,以代替案例2中的a(i)。我们可以通过以下方法解决此问题:
如果将第k个杆置于第i个位置,则该杆的预期射线长度是多少
然后,将所有位置的所有杆的所有预期长度相加,即可解决该问题
设expected[k][i]
为放入第i个位置的第k个棒的预期射线长度,设num[k][i][length]
为放入第i个位置的第k个棒的射线长度等于length
的排列数,然后
expected[k][i]=sum(num[k][i][length]*length)/N代码>
如何计算num[k][i][length]
?例如,对于<代码>长度=3 < /代码>,请考虑下面的图表:
…GxxxI
其中,I
是位置,3'x'表示我们需要3根比I
严格低的棍子,G
表示我们需要至少与I
一样高的棍子。
假设s_i
是小于k
th的棍棒数,g_i
是大于或等于k
th棍棒数的棍棒数,那么我们可以选择g_i
中的任何一个将其置于g
位置,我们可以选择s_i
的任何length
来填充x
位置,因此我们有:
num[k][i][length]=p(s_i,length)*g_i*p(n-length-1-1)
如果I
之前的所有位置都小于I
,我们不需要更大的G
,即xxxI….
,我们有:
num[k][i][length]=p(s_i,length)*p(n-length-1)
这里有一段Python代码可以解决这个问题:
def solve(n, ys):
ret = 0
for y_i in ys:
s_i = len(filter(lambda x: x < y_i, ys))
g_i = len(filter(lambda x: x >= y_i, ys)) - 1
for i in range(n):
for length in range(1, i+1):
if length == i:
t_ret = combination[s_i][length] * factorial[length] * factorial[ n - length - 1 ]
else:
t_ret = combination[s_i][length] * factorial[length] * g_i * factorial[ n - length - 1 - 1 ]
ret += t_ret * length
return ret * 1.0 / factorial[n] + n
def solve(n,ys):
ret=0
对于y_i in ys:
s_i=len(滤波器(λx:x=y_i,ys))-1
对于范围(n)中的i:
对于范围(1,i+1)中的长度:
如果长度==i:
t_ret=组合[s_i][length]*阶乘[length]*阶乘[n-长度-1]
其他:
t_ret=组合[s_i][length]*阶乘[length]*g_i*阶乘[n-长度-1-1]
ret+=t_ret*长度
返回ret*1.0/阶乘[n]+n
我们可以通过以下方法解决此问题:
如果将第k个杆置于第i个位置,则该杆的预期射线长度是多少
然后,将所有位置的所有杆的所有预期长度相加,即可解决该问题
设expected[k][i]
为放入第i个位置的第k个棒的预期射线长度,设num[k][i][length]
为放入第i个位置的第k个棒的射线长度等于length
的排列数,然后
expected[k][i]=sum(num[k][i][length]*length)/N代码>
如何计算num[k][i][length]
?例如,对于<代码>长度=3 < /代码>,请考虑下面的图表:
…GxxxI
其中,I
是位置,3'x'表示我们需要3根比I
严格低的棍子,G
表示我们需要至少与I
一样高的棍子。
设s_i
为小于k> V(c(1,2,3))
[1] 4.333333
> V(c(3,3,3))
[1] 3
> V(c(2,2,3))
[1] 4
> V(c(10,2,4,4))
[1] 6
> V(c(10,10,10,5,10))
[1] 5.8
> V(c(1,2,3,4,5,6))
[1] 11.15