题目:

题目要我们,在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-];   // 第i项到第j项的和
double s1 = 1.0*k1/n*k1/n; // k1/n表示平均数E(x), s1表示E(x)^2
ll k2 = sum2[j]-sum2[i-]; // 第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[];
ll sum1[]; //sum1[i]表示前i项和
ll sum2[]; //sum2[i]表示前i项平方和
int main() {
ll m,n;
cin >> m >> n;
for(int i = ;i <= m; i++){
cin >> a[i];
} sort(a+,a++m); // 排个序,让数字变得紧凑
for(int i = ;i <= m; i++){
sum1[i] = sum1[i-] + a[i];
sum2[i] = sum2[i-] + 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-;
cout << (ll)(mn*n) << endl;
return ;
}
// writen by zhangjiuding

51nod 1098 最小方差 排序+前缀和+期望方差公式的更多相关文章

  1. 51Nod 1098 最小方差 (数论)

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; ty ...

  2. 51nod 1098 最小方差

    #include <iostream> #include <cstdio> #include <algorithm> using namespace std; ty ...

  3. 51nod 1065 最小正子段和

    题目链接:51nod 1065 最小正子段和 房教说用前缀和做,然后看了别人博客懂了后就感觉,这个真有意思... #include<cstdio> #include<cstring& ...

  4. java算法----排序----(6)希尔排序(最小增量排序)

    package log; public class Test4 { /** * java算法---希尔排序(最小增量排序) * * @param args */ public static void ...

  5. 51nod 1065 最小正字段和 解决办法:set存前缀和,二分插入和二分查找

    题目: 这题要求大于0的最小字段和,常规O(n)求最大字段和的方法肯定是没法解的. 我的解法是:用sum[i]存前i项的和,也就是前缀和. 这题就变成了求sum[j]-sum[i]的大于0的最小值( ...

  6. 51nod 1065 最小正子段和 (贪心)

    题目:传送门. 题意:中文题. 题解:求前缀和,并且标记每个数的下标,按照前缀和大小进行从小到大排序.随后进行遍历,如果满足下标data[i-1].id<data[i].id&& ...

  7. 51nod 1510 最小化序列 | DP 贪心

    题目描述 现在有一个长度为n的数组A,另外还有一个整数k.数组下标从1开始. 现在你需要把数组的顺序重新排列一下使得下面这个的式子的值尽可能小. ∑|A[i]−A[i+k]| 特别的,你也可以不对数组 ...

  8. 51nod 1682 中位数计数(前缀和)

    51nod 1682 中位数计数 思路: sum[i]表示到i为止的前缀和(比a[i]小的记为-1,相等的记为0,比a[i]大的记为1,然后求这些-1,0,1的前缀和): hash[sum[i]+N] ...

  9. 51nod 1283 最小周长【注意开根号】

    1283 最小周长 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题  收藏  关注 一个矩形的面积为S,已知该矩形的边长都是整数,求所有 ...

随机推荐

  1. POJ 2388 基数排序

    这题可以直接nth_element过去 比如这样子 //By SiriusRen #include <cstdio> #include <algorithm> using na ...

  2. ffmpeg x264编译与使用介绍

    问题1:我用的是最新版本的ffmpeg和x264,刚刚编译出来,编译没有问题,但是在linux 环境使用ffmpeg的库时发现报错error C3861: 'UINT64_C': identifier ...

  3. 案例分析:大数据平台技术方案及案例(ppt)

    大数据平台是为了计算,现今社会所产生的越来越大的数据量,以存储.运算.展现作为目的的平台.大数据技术是指从各种各样类型的数据中,快速获得有价值信息的能力.适用于大数据的技术,包括大规模并行处理(MPP ...

  4. C#实现软件监控外部程序运行状态的方法

    本文实例讲述了C#实现软件监控外部程序运行状态的方法.分享给大家供大家参考.具体方法如下: 需要外挂一个程序,用于监控另一个程序运行状态,一旦检测到另一程序关闭,就触发一个事件做其他处理. using ...

  5. php方法-------将汉字转为拼音或者提取汉字首字母

    将汉字转为全拼,提取汉字首字母 <?php /** * 基于PHP语言的汉语转拼音的类 * 兼容 UTF8.GBK.GB2312 编码,无须特殊处理 * 对中文默认返回拼音首字母缩写,其它字符不 ...

  6. ZBrush中如何实现智能对称

    ZBrush软件智能化和人性化的工作流程让用户在创作中提高工作效率,体验创作乐趣,说起智能化不得不提的就是ZBrush 4R8®给我们提供的智能对称功能,所谓的智能对称就是当您在编辑其中一半的物体模型 ...

  7. linux下如何查看cpu信息

    linux的cpu信息可以从文件中cpuinfo读取. 执行命令: # cat  /proc/cpuinfo   我们一般看到的processor是逻辑核. 它的计数是从0开始的,例如这里看到的是31 ...

  8. PHP动态函数处理

    public class Student{ public function speek($name){ echo 'my name is '.$name; } } $method='speek'; $ ...

  9. 2019-03-15 Python time datetime 获取当下时间 和 格式化时间

    import datetime start_date='2018-01-10' end_date='2019-01-10'# 转换为2018-01-10 00:00:00start_date=date ...

  10. 在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效??

    在Vue中使用了Swiper ,动态从后台获取数据的之后,swiper滑动失效?? 是因为swiper提前初始化了,那时候数据还没有完全出来.这里有两种解决办法 1. 使用vue提供的$nextTic ...