51nod 1098 最小方差 (排序+精度)


若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


将s^2 = 1/n * [(x1-k)^2+(x2-k)^2+.......+(xn-k)^2] 化成一般项然后直接找。。。。


化为    x1^2+x2^2+·····+xn^2+n*k-2*k*(x1+x2+x3+·····+xn)   然后就好解决了。。ok的 





#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int maxn=10000+10;
typedef long long ll;
ll a[maxn],pre[maxn],sum[maxn];
long double aver[maxn];
int main()
{
	 ios::sync_with_stdio(false);  
	int n,m,i,j;
	long double ans,t;
	cin>>m>>n;
	for(i=1;i<=m;i++) cin>>a[i];
	sort(a+1,a+m+1);
	for(i=1;i<=m;i++) {
		sum[i]=sum[i-1]+a[i];
		pre[i]=pre[i-1]+a[i]*a[i];
	}
	int ss=0;
	for(i=1;i<=n;i++) ss+=a[i];
	aver[i-1]=(double) ss/n;
	for(i=n+1;i<=m;i++) {
		ss=ss-a[i-n]+a[i];
		aver[i]=(double) ss/n;
	}
	ans=(double) pre[n]+n*aver[n]*aver[n]-2*aver[n]*sum[n];
	for(i=n+1;i<=m;i++) {
		t=pre[i]-pre[i-n]+n*aver[i]*aver[i]-2*aver[i]*(sum[i]-sum[i-n]);
		ans=min(ans,t);
	}
	ans=floor(ans);
	cout<<(long long)ans<<endl;
	return 0;
} 




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值