51nod 1098 最小方差 排序+前缀和+期望方差公式

题目:

 

题目要我们,在m个数中,选取n个数,求出这n个数的方差,求方差的最小值。

 

1.我们知道,方差是描述稳定程度的,所以肯定是着n个数越密集,方差越小。

  所以我们给这m个数排个序,从连续的n个数中找。

 

2.方差公式D(x^2) = E(x^2)- E(x)^2;

  E(x) = x*f(x) dx (从负无穷到正无穷积分)

  E (x^2) = x^2*f(x) dx (从负无穷到正无穷积分)

 

3.对于这道题,相当于每个数的权值相同,也就是f(x)相同,都等于1/n。(可以理解f(x)表示概率)

 

4.我们可以用前缀和来减少时间复杂度。

  sum1[i]表示前 i 项的和,方便算出E(x)^2

  sum2[i]表示前 i 项平方和 ,方便算出E(x^2)

 当我们要算第 i 项到第 j 项共 j-i+1 项的方差的时候我们只用这样写:

ll k1 = sum1[j]-sum1[i-1];   // 第i项到第j项的和
double s1 = 1.0*k1/n*k1/n;  // k1/n表示平均数E(x), s1表示E(x)^2
ll k2 = sum2[j]-sum2[i-1];   // 第i项到第j项的平方和
double s2 = 1.0*k2/n;         // s2 和 k2/n 表示E(x^2)

  第 i 项到第 j 项的方差就等于 s2-s1 了。

 

5.我们可以得到大致代码,当然现在就可以直接开始敲了,如果看懂了的话。

    double mn = 2e18;
    for(int i = n;i <= m; i++){
        ll k1 = sum1[i]-sum1[i-n];
        double s1 = 1.0*k1/n*k1/n;
        ll k2 = sum2[i]-sum2[i-n];
        double s2 = 1.0*k2/n;
        
        mn = min(s2-s1,mn);
    }

 

 

6.我们要注意一下精度问题,我的做法是给mn += 1e-8。

 

 

 

代码:

#include <bits\stdc++.h> 
using namespace std;
typedef long long ll;

int a[10010];
ll sum1[10010];  //sum1[i]表示前i项和 
ll sum2[10010];  //sum2[i]表示前i项平方和 
int main() {
  ll m,n;
  cin >> m >> n;
    for(int i = 1;i <= m; i++){
        cin >> a[i];
    }
    
    sort(a+1,a+1+m);  // 排个序,让数字变得紧凑 
    for(int i = 1;i <= m; i++){
        sum1[i] = sum1[i-1] + a[i];
        sum2[i] = sum2[i-1] + a[i]*a[i];
    }
    
    double mn = 2e18;      //存最小的方差 
    for(int i = n;i <= m; i++){
        ll k1 = sum1[i]-sum1[i-n];  // 第 i-n+1 项到第 i项共 n 项的和。 
        double s1 = 1.0*k1/n*k1/n;  // k1/n表示平均数E(x),s1表示 E(x)^2 
        ll k2 = sum2[i]-sum2[i-n];  // 第 i-n+1 项到第 i项共 n 项的和。
        double s2 = 1.0*k2/n;       // k2/n表示E(x^2) 
        
        mn = min(s2-s1,mn);    
    }
    
    // 如果不加这个可能会出问题,因为cout  double用的是科学记数法,需要消除误差。
    mn += 1e-8;     
    cout << (ll)(mn*n) << endl;
  return 0;
}
//  writen by zhangjiuding 

 

转载于:https://www.cnblogs.com/zhangjiuding/p/7631313.html

利用 TensorFlow 训练自己的目标识别器。本文内容来自于我的毕业设计,基于 TensorFlow 1.15.0,其他 TensorFlow 版本运行可能存在问题。.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值