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语言从例子开始之Example16.函数递归
Go 支持 递归.这里是一个经典的阶乘示例. Example: package main import "fmt" func fact(n int) int{ //先设置退出条件 ...
- 【记录】Idea "Cannot resolve symbol 'SpringBootApplication'" 错误&“找不到主类”错误
初学,有一个Spring Boot的demo需要用Idea打开.我选择导入(Import Project选项)文件,出现如题错误,且yml文件格式也不正确显示(叶子). 后面细看目录,发现一个main ...
- reduce 好东西
reduce()方法可以搞定的东西,for循环,或者forEach方法有时候也可以搞定,那为啥要用reduce()?这个问题,之前我也想过,要说原因还真找不到,唯一能找到的是:通往成功的道路有很多,但 ...
- 【QT学习】数独游戏
前几天刷leetcode刷到一题,讲sudokuSolver,写完感觉很有意思,遂想做一个数独游戏,百度了一下如何自动生成题库,参考某位大神安卓下的实现思路,自己做了一套文字版的数独游戏,后来想乘机会 ...
- 数据库索引原理,及MySQL索引类型(转)
在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable表: CREATE TABLE mytable( ID INT NOT NULL, username ) NOT N ...
- Bootstrap 网页1
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- 阿里云安装Cloudera Manager(草稿)
选择三台同一局域网的阿里云服务器 最初使用阿里云.京东云.百度云的三台不同的服务器,遇到一些问题,没有解决,公网速度也没有保障,还是选择同一局域网的服务器吧 CM有三种不同的安装方式: 通过 Clou ...
- PWM输出,呼吸灯
一.初始化GPIO 使用PB1,查芯片手册对应TIM3_CH4 GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2 ...
- vuedraggable 实现拖动数据改变
// 引入组件 import Draggable from 'vuedraggable' // 使用组件 DragList 为自己封装好的组件 注意一定要使用vue的sync <DragList ...
- cookie的使用说明
cookie的英文意思是饼干的意思,实质上是键值对组成的字典.就是说你访问某一个网址,服务器给你一个东西,你收到东西,并且贴上了一个标签.下次你访问服务器的时候,请求带有标签.这样服务器给你之后,就会 ...