若x1,x2,x3……xn的平均數為k。
則方差s^2 = 1/n * [(x1-k)^2+(x2-k)^2+…….+(xn-k)^2] 。
方差即偏離平方的均值,稱為標準差或均方差,方差描述波動程度。
給出m個數,從中找出n個數,使這n個數方差最小。
input
第1行:2個數m,n,(m > n, m <= 10000)
第2 - m + 1行:m個數的具體值(0 <= xi <= 10000)
output
輸出最小方差 * n的整數部分。
input示例
5 3
1 2
3 4
5 output示例
2解題思路:
剛開始我是這麼想的,因為方差的作用是偏離平方的均值,也就是反應這個序列是不是穩定的,所以我就想首先按照從小到大排序,然後錢前面 m 個數 都減去 a[j] 並且相加 的出的最小的和 就是 方差最小,
但是很不幸wa了,不知道什麼情況,所以我又換了一種方法,就是將求方差那個公式展開,因為最後還要乘以 m ,所以最開始的時候就不用乘以 m 了: 將
s2=(
x1−k
)2+(
x2−k
)2+.
....
..+(
xn−k
)2n展
開為:(
x21+
x22+
...+
x2n)
−2k∗
(x1+
x2+.
..+x
n)+n
∗k2又
因為:k
=(x1
+x2+
...+
xn)n
所以:s
2=(x
21+x
22+.
..+x
2n)−
(x1+
x2+.
..+x
n)2n
就可以寫程式了, 我們就只需要找最小的s^2就行了;
#includeusing namespace std;
#define maxn 10000+10
int a[maxn];
double b[maxn];
double c[maxn];
int main()
sort(a+1,a+n+1);
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
double mi=999999999999;
for(int j=1;j<=n;j++)
double var;
for(int j=m;j<=n;j++){
var=(c[j]-c[j-m])-(b[j]-b[j-m])*(b[j]-b[j-m])/m;
if(var
51nod 1098 最小方差
1098 最小方差 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 若x1,x2,x3.xn的平均數為k。則方差s 2 1 n x1 k 2 x2 k 2 xn k 2 方差即偏離平方的均值,稱為標準差或均方差,方差描述波動程度。給出m個數,從中找出n個數,使這n...
51nod1098 最小方差 公式暴力
1098 最小方差 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 若x1,x2,x3.xn的平均數為k。則方差s 2 1 n x1 k 2 x2 k 2 xn k 2 方差即偏離平方的均值,稱為標準差或均方差,方差描述波動程度。給出m個數,從中找出n個數,使這n...
51Nod 1098 最小方差 數學
題目 若x1,x2,x3.xn的平均數為k。則方差s 2 1 n x1 k 2 x2 k 2 xn k 2 方差即偏離平方的均值,稱為標準差或均方差,方差描述波動程度。給出m個數,從中找出n個數,使這n個數方差最小。輸入 第1行 2個數m,n,m n,m 10000 第2 m 1行 m個數的具體值 ...