题目描述

Winter is coming.

Robert 是个昏庸的君主,整日沉迷于吃喝玩乐,终于,当寒冬降临,他不得不组

织军队来对抗敌人。

尽管如此,他仍然是个喜欢玩耍的人,还有点强迫症,他希望选出的军队的所有

人的身高的方差最小,并且选出的人数 x 要满足 L<=x<=R,因为太少了他怕不够

气势,太多了他怕会控制不当。

现在给出 n 个士兵的高度,L 和 R,Robert 找到了聪明的你,希望你帮他解决这

个难题。

输入

第一行三个整数,依次是 n,L,R

第二行 n 个正整数,表示每个士兵的高度 h

输出

一行,表示最小的方差,保留三位小数即可。

样例输入

5 3 4

3 2 4 1 4

样例输出

0.222

样例解释

数据范围

对于20%的数据,1<=n<=20

对于50%的数据,1<=n<=2000,R-L+1<=2000

对于100%的数据,1<=L<=R<=n<=100000,1<=h[i]<=1000000000

【题解】

20%

1<=n<=20显然直接枚举每个士兵选不选,时间O(n*2^n)

50%

我们要做到50分,就首先要得到一个结论:我们先将h从小到大排序,那么我们选择的序列一定是连续的一段。



由t>0和n>=1,那么后者的方差一定是大于等于前者的,这个存在传递性,所以得证。

于是就可以枚举开头,枚举长度,然后算一下就好了。

100%

对于100分的算法,我们需要另外一个结论:任意一个序列,它加上一个新元素不会使得其方差更优。

证明与上面类似我就不说了。

然后就是说我们只用求长度为L的序列中的方差的最大值,于是直接扫一遍计算就好了。

当然,上面是出题人的题解,有点麻烦,我自己来搞一个。

拆一波方差公式



然后这个公式就可以维护前缀和了。

于是,从1开始枚举长度为L的子序列即可(当然要以前面题解给出的两个结论为基础)。O(1)询问跑的飞快。

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;i++)
#define fq(i,a,b) for(re int i=a;i>=b;i--)
using namespace std;
const int MAX=100005;
int n,L,R;
double h[MAX],sum[MAX],tot[MAX];
double ans=2147483646.0;
void calc(int l,int r)
{
double res;
res=(tot[r]-tot[l-1])/(L*1.0)-((sum[r]-sum[l-1])/(L*1.0))*((sum[r]-sum[l-1])/(L*1.0));//就是方差公式拆完的结果
ans=min(ans,res);
}
void solve()
{
fp(i,L,n)//从1开始枚举长度为L的子序列
calc(i-L+1,i);
}
il int gi()
{
re int x=0;
re short int t=1;
re char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
int main()
{
freopen("army.in","r",stdin);
freopen("army.out","w",stdout);
n=gi();L=gi();R=gi();
fp(i,1,n) h[i]=gi();
sort(h+1,h+1+n);
fp(i,1,n) sum[i]=sum[i-1]+h[i],tot[i]=tot[i-1]+h[i]*h[i];//sum存ai的前缀和,tot存ai^2的前缀和
solve();
printf("%.3lf\n",ans);
fclose(stdin);
fclose(stdout);
return 0;
}

Robert 的军队的更多相关文章

  1. 1393: Robert Hood 旋转卡壳 凸包

    http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1393 http://poj.org/problem?id=2187 Beauty Contest ...

  2. Algorithms, Part I by Kevin Wayne, Robert Sedgewick

    Welcome to Algorithms, Part I 前言 昨天在突然看到了Coursera上Robert Sedgewick讲的Algorithms,Part II看了一些,甚是爽快,所以又去 ...

  3. paper 82:边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny)

    不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界 ...

  4. 算法java(Robert Sedgewick)基本API-StdOut.java

    /************************************************************************* * Compilation: javac StdO ...

  5. 图像处理-07-图像的轮廓提取-Robert算子

    图像的轮廓提取-Robert算子 图像的边缘:周围像素灰度有阶跃变化或“屋顶”变化的那些像素的集合,边缘广泛存在于物体与背景之间.物体与物体之间,基元与基元之间,是图像分割的重要依据. 物体的边缘是由 ...

  6. Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)

    初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...

  7. Robert Penner's Easing Functions

    Robert Penner's Easing Functions Robert Penner's Easing Functions A collection of swappable function ...

  8. 编程算法 - 萨鲁曼的军队(Saruman&#39;s Army) 代码(C)

    萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每个点, 其距离为R以内的区域里 ...

  9. 蓝桥杯 - G将军有一支训练有素的军队 - [树形DP]

    G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军).现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死 ...

随机推荐

  1. blog笔录1

    (1)虚拟主机 (2)部署 部署完成后刷新页面会看到笑脸,在Home分组下控制器Application/Home/Controller/IndexController.class.php下定义显示 ( ...

  2. A2. JVM 类加载机制

    [概述] 虚拟机把描述类的数据从 Class 文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的 Java 类型,这就是虚拟机的类加载机制. 与那些在编译时需要进行连接 ...

  3. SQL删除重复数据(根据多个字段),pandas的nan存入数据库报错

    delete from M_FACTOR_DATA_TEST a where (a.factor_id,a.data_date,a.stock_code) in (select factor_id,d ...

  4. JAVA基础——构造函数方法总结(有参构造和无参构造)

    使用构造器时需要记住: 1.构造器必须与类同名(如果一个源文件中有多个类,那么构造器必须与公共类同名) 2.每个类可以有一个以上的构造器 3.构造器可以有0个.1个或1个以上的参数 4.构造器没有返回 ...

  5. swift 集成使用最新版百度地图_v2.10.2(一)

    目前在开发中使用百度地图的APP越来越多了,我在网上找的集成百度地图的例子不是很多,于是我就将我集成百度地图的过程记录了下来: 一.前提:安装CocoaPods sudo gem install co ...

  6. 前k大金币(动态规划,递推)

    /* ///题解写的很认真,如果您觉得还行的话可以顶一下或者评论一下吗? 思路: 这题复杂在要取前k大的结果,如果只是取最大情况下的金币和,直接 动态规划递归就可以,可是前k大并不能找出什么公式,所以 ...

  7. 初遇Java

    什么是JVM?JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚拟机上,不同平台有自己的虚拟机,因此java语言可以跨平台. 什么是JRE?包括Jav ...

  8. lastpass密码管理工具使用教程

    现在移动互联网发展异常空气,无论访问哪个平台或者网站必须要注册账号,日子久了就会发现最痛苦的就是记住这些网站的密码.因为我们不可能将所有的网站都是设置同样的的账号密码,因为国内网站用户数据库被泄露的事 ...

  9. SQL Server 机考,用T-SQL编写 简单实例

    使用T-SQL实现以下要求: 要求如下: 1,添加数据库:MySchool 2,添加学生基础表:Student 3,添加学生成绩表:ScoreInfo 4,两张表结构分别如下 Student表结构:( ...

  10. PAT 1141 PAT Ranking of Institutions

    After each PAT, the PAT Center will announce the ranking of institutions based on their students' pe ...