在ACM ICPC 2018预赛中提出了这个问题。您必须打印任何长度 N 的数组,其标准差为K。
答案 0 :(得分:0)
你没有提到对数据类型的约束,所以我假设你对浮点结果没问题(另一种方法是你想要只有整数的解决方案,如果这是意图,那么下面的内容严重不足之处任务。)
在实际情况下,我们希望给定一个长度为n-1
且标准差为k'
的数组,我们应该能够得到一个长度为n
的数组,其标准偏差为{{1}通过向较短的数组添加一些元素。也就是说,通过调整新元素,我们可以连续扫描从k > k'
开始并继续上去的所有值。
通过这种观察,我们可能会猜测我们可以从任何名义数组开始 - 比如k
长度为[0, 0, ..., 0]
,并添加一些元素以使标准偏差“出来”正确。让我们调用要添加的值n - 1
。这种数组的意思是:
v
方差如下:
m = (0 + 0 + ... + 0 + v) / n = v/n
我们可以在表达式中替换均值:
s^2 = [(0-m)^2 + (0-m)^2 + ... + (0-m)^2 + (v-m)^2] / n
我们可以将s^2 = [(v/n)^2 + (v/n)^2 + ... + (v/n)^2 + (v-v/n)^2] / n
术语分解为:
v^2
我们可以用乘法代替重复加法:
s^2 = v^2[(1/n)^2 + ... + (1/n)^2 + (1-1/n)^2] / n
最后,我们可以求解s^2 = v^2 [(n-1)(1/n)^2 + (1-1/n)^2] / n
以查看我们添加到数组中的内容:
v
一些代数表明这简化为:
v = s / sqrt([(n-1)(1/n)^2 + (1-1/n)^2] / n)
回想一下,我们给了v = s * n / sqrt(n - 1)
,所以通过替换,我们可以确定s = k
:
v
生成的数组将包含v = k * n / sqrt(n - 1)
个零和一个n - 1
。
示例:v
:
k = 1, n = 10