Galaxy
在一维坐标轴上给出n个点,第i个点坐标为\(x_i\),现在你可以任意移动k个点的,最小化它们的方差,\(n\leq 50000\)。
解
感觉以前写的太乱了,补一篇可以供快速阅读的题解
首先方差有个公式\(\sum_{i=1}^n(x_i-\bar{x})^2=\sum_{i=1}^nx_i^2-n\bar{x}^2\),假设我们已经确定了移动那些点,假设移动的是\(x_1,x_2,...,x_k\),那么要让方差最大,就相当于是一个多元函数求最值的问题,设\(F(x_1,...,x_k)=\sum_{i=1}^nx_i^2-n\bar{x}^2\),结论是关于各个变量的偏导为\(0\)的时候取到最值,也就是对于任意一个\(j\)有\(x_j=\dfrac{\sum_{i=1,i\ne j}^n}{n-1}\),如果\(k=1\),那么这个点恰好是在剩下点的平均数取到,因此可以猜测这\(k\)个点都是在剩下点的平均数位置,证明参考原来的版本就可以了。
然后答案就是\(\sum_{i=1}^nx_i^2-n\bar{x}^2=\sum_{i=k+1}^nx_i^2-(n-k)\bar{x}^2\),这个恰好就是剩下\(n-k\)个数的方差,最小化,这要让他们坐标连续即可,这样就可以做到\(O(n^2)\),考虑枚举右端点,看左端点套路,预处理平方和和前缀和,就可以做到\(O(n)\)了。
设\(\bar{x}=\frac{\sum_{i=1}^nx_i}{n}\),容易知道方差为
\]
对于只移动一个点坐标x来看,显然可以看成一个二次函数,即
\(f(x)=\sum_{i=1}^n{x_i}^2-n\bar{x}^2\)
因为化简过于复杂,对它进行求导,这样与x无关的项都可以丢掉了
\]
\]
容易知道随着x的增加,这个导函数是在单调递增的,因此它存在最小值,显然是在驻点处取到,故令\(f(x)'=0\),有
\(x=\bar{x}\Rightarrow x=\frac{\sum_{i=1}^nx_i-x}{n-1}\)
于是对于只动一个坐标x而言,x取到除x以外的点的平均值所在的点就是答案,我们还可以得到一个结论,往数的集合中加入它的平均数,不改变新的集合的平均数。
但是我们需要讨论k个点的情况,于是对于每个点\(x_i\)我们可以有(不妨假设这k个点为\(x_1,x_2,..,x_k\)),那么分别有
\]
\]
累加起来有
\]
也就是
\]
也就是
\]
于是我们得到了k个要动的数的平均值恰好为n个数的平均值,继续变
\]
\]
也就是
\]
整理起来也就有
\]
所以可以得出一个很棒的结论,向一个集合中加入若干个平均数为改个集合的平均数,平均数不变,原来的集合的平均数等于加进的平均数等于新集合的平均数,而且满足两个相等,可以推出三个相等。
现在考虑k个数的方差,方差显然转换成下式比较好研究
\]
其余n-k个数字是常量(包括平均数),拆开有
\]
于是要让整个式子最小化,也就是最小化
\]
根据均值不等式,容易知道最小化这个式子,要满足\(x_1=x_2=...=x_k\)。
而我们有\(\frac{x_1+x_2+...+x_k}{k}=\frac{kx_1}{k}=x_1=\bar{x}\),于是有
\]
也就是对于这k个数字,我们只要都放到剩下的数字平均数所在位置即可,而根据方差定义式。
\]
容易知道,此时这k个数字所产生的影响为0,因为\(x_i=\bar{x}(i=1,2,...,k)\)
于是我们只要考虑剩下n-k个数字的方差即可,而根据方差的实际含义,数字的离散程度,于是剩下n-k个数字要尽可能集中,于是我们只需要将所有坐标排序,取连续的长度为\(n-k\)的区间,把它们的方差取max即可,为了快速求出方差,我们根据推广式
\]
而\(\bar{x}=\frac{\sum_{i=1}^nx_i}{n}\),因此我们只要维护平方的前缀和和普通的前缀和,带入这个式子计算,就可以做到\(O(1)\)查询区间的方差了,整个时间复杂度仅有\(O(n)\)。
参考代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define il inline
#define ri register
#define lb double
#define Size 50500
using namespace std;
lb a[Size],sum[Size],sum2[Size];
int main(){
int lsy,n,k;scanf("%d",&lsy);
while(lsy--){
scanf("%d%d",&n,&k);
for(int i(1);i<=n;++i)
scanf("%lf",&a[i]);
if(n==k){printf("%.11lf\n",(lb)0);continue;}
sort(a+1,a+n+1);lb ans(1e100);k=n-k;
for(int i(1);i<=n;++i)
sum[i]=sum[i-1]+a[i],
sum2[i]=sum2[i-1]+a[i]*a[i];
for(int i(k);i<=n;++i)
ans=min(ans,sum2[i]-sum2[i-k]-k*pow((sum[i]-sum[i-k])/k,2));
printf("%.11lf\n",ans);
}
return 0;
}
Galaxy的更多相关文章
- Galaxy Classification
10.3 Data Preparation After removing a large number of the columns from the raw SDSS dataset, introd ...
- DFS --- HNU 13307 Galaxy collision
Galaxy collision Problem's Link Mean: 给定二维坐标平面内的n个整数点,让你把这n个点划分为两个集合,同一集合内的所有点必须两两距离大于5,求这两个集合的元素个数之 ...
- 2014 Asia AnShan Regional Contest --- HDU 5073 Galaxy
Galaxy Problem's Link: http://acm.hdu.edu.cn/showproblem.php?pid=5073 Mean: 在一条数轴上,有n颗卫星,现在你可以改变k颗 ...
- 技术解析:锁屏绕过,三星Galaxy系列手机也能“被”呼出电话
近期,由两位安全研究人员,Roberto Paleari及Aristide Fattori,发布了关于三星Galaxy手机设备安全漏洞的技术细节.据称,Galaxy手机可在锁屏状态下被未授权的第三方人 ...
- 三星Galaxy Note 10.1 N8010 最后的救赎 Andorid 5.0.2 ROM
上市日期为2012年的三星Galaxy Note N8010 10.1采用10.1英寸TFT屏幕,分辨率为1280×800,支持10点触控,支持S pen手写笔功能.,拥有一颗1.4GHz Exyno ...
- 三星galaxy s4问题解决及快捷操作
http://blog.csdn.net/pipisorry/article/details/38474827 三星galaxy s4更改锁屏方式时出现故障 屏幕锁定设置除password以外,其它锁 ...
- 三星手机 Samsung Galaxy S3 无法复制粘贴的不完美解决方法
问题简单描述 从上周开始我的Samsung Galaxy S3手机就无法实现复制粘贴功能了,每次复制时都提示复制到了剪贴板,但是粘贴时就会发现根本粘贴不了,无法打开剪贴板.真的是莫明其妙啊,我的手机没 ...
- 【数学,方差运用,暴力求解】hdu-5037 Galaxy (2014鞍山现场)
话说这题读起来真费劲啊,估计很多人做不出来就是因为题读不懂...... 从题目中提取的几点关键点: 题目背景就是银河系(Rho Galaxy)中的星球都是绕着他们的质心(center of mass) ...
- HDOJ 5073 Galaxy 数学 贪心
贪心: 保存连续的n-k个数,求最小的一段方差... .预处理O1算期望. .. Galaxy Time Limit: 2000/1000 MS (Java/Others) Memory Lim ...
- ZOJ 3261 - Connections in Galaxy War ,并查集删边
In order to strengthen the defense ability, many stars in galaxy allied together and built many bidi ...
随机推荐
- go语言从例子开始之Example25.通道方向
当使用通道作为函数的参数时,你可以指定这个通道是不是只用来发送或者接收值.这个特性提升了程序的类型安全性. Example: package main import "fmt" / ...
- oracle10G锁查询、批量杀锁及常用sql
前言 记录1.oracle10G锁查杀技巧 2.资源检查方面的sql 锁查杀 找出所有被锁的对象.注意:不一定是死锁,大部分应该是阻塞,如果发现大量的锁对象,一定要检查程序逻辑了,优化sql sele ...
- Quartz -----定时任务框架
一.什么是Quartz 由java开发用来执行定时任务,类似于java.util.Timer. 但是相较于Timer,quartz增加了很多功能: 持久性 ...
- PyTorch 计算机视觉的迁移学习教程代码详解 (TRANSFER LEARNING FOR COMPUTER VISION TUTORIAL )
PyTorch 原文: https://pytorch.org/tutorials/beginner/transfer_learning_tutorial.html 参考文章: https://www ...
- Python--反射(重点)、面向对象内置方法:如__str__、面向对象的软件开发
复习: Python3统一了类与类型 类的名称空间在定义阶段产生,看名称空间:类.__dict__ Python3特点:可以多继承 Python3都是新式类 继承意义:解决重复代码 组合:也是解决 ...
- Python基础教程(010)--第一个程序Hello Python
前言 会编写Hello Python源程序 内容 1,在桌面下,新建Python目录 2,在认识的Python目录下,新建一个HelloPython的文件 linux下: touch HellPyth ...
- paper 133:结构张量Structure Tensor(一)
1.结构张量的作用: 能够区分图像中的平坦区域,边缘,角点: 2.图像中的结构张量的定义 1)是一个矩阵: 2)与图像的水平,垂直梯度有关,定义如下: 在MATLAB中,可以用 ...
- <自动化测试>之<Selenium API 的用法1>
今天,简单,举例说一下在用python+selenium中元素定位的主要方法,第一部分是单个元素的操作,第二部分是一类元素的操作,实际操作中注意区分 #!/usr/bin/env python # - ...
- Kali Linux下运行nfc工具测试!
由于Kali本身就集成了很多nfc工具,用起来很方便,再加上一个acr122u读卡器,来尝试PJ学校水卡! 首先安装驱动,到龙杰官网下载Linux的,解压后进入自己Linux发行版,Kali的是Deb ...
- RabbitMQ(七)心跳控制 -- heartbeat
https://blog.csdn.net/jiao_fuyou/article/details/23186407