51nod 最小方差 1098

2021-08-09 12:24:40 字數 1440 閱讀 7474

若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個數的具體值 ...