Robert 的军队
题目描述
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 的军队的更多相关文章
- 1393: Robert Hood 旋转卡壳 凸包
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1393 http://poj.org/problem?id=2187 Beauty Contest ...
- Algorithms, Part I by Kevin Wayne, Robert Sedgewick
Welcome to Algorithms, Part I 前言 昨天在突然看到了Coursera上Robert Sedgewick讲的Algorithms,Part II看了一些,甚是爽快,所以又去 ...
- paper 82:边缘检测的各种微分算子比较(Sobel,Robert,Prewitt,Laplacian,Canny)
不同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像.需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界 ...
- 算法java(Robert Sedgewick)基本API-StdOut.java
/************************************************************************* * Compilation: javac StdO ...
- 图像处理-07-图像的轮廓提取-Robert算子
图像的轮廓提取-Robert算子 图像的边缘:周围像素灰度有阶跃变化或“屋顶”变化的那些像素的集合,边缘广泛存在于物体与背景之间.物体与物体之间,基元与基元之间,是图像分割的重要依据. 物体的边缘是由 ...
- Qt自定义事件的实现(军队真正干活,但要增加监军,大平台通知事件,事件内容自定义)
初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢?看了篇文章,说先要子类化QEvent,然后定义自己的QEvent::Type,然后重写QWidget::event ...
- Robert Penner's Easing Functions
Robert Penner's Easing Functions Robert Penner's Easing Functions A collection of swappable function ...
- 编程算法 - 萨鲁曼的军队(Saruman's Army) 代码(C)
萨鲁曼的军队(Saruman's Army) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 题目: 直线上有N个点, 每个点, 其距离为R以内的区域里 ...
- 蓝桥杯 - G将军有一支训练有素的军队 - [树形DP]
G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军).现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死 ...
随机推荐
- Android studio 开发一个用户登录界面
Android studio 开发一个用户登录界面 activity_main.xml <?xml version="1.0" encoding="utf-8&qu ...
- NOIP2000方格取数(洛谷,动态规划递推)
先上题目: P1004 方格取数 下面上ac代码: ///如果先走第一个再走第二个不可控因素太多 #include<bits/stdc++.h> #define ll long long ...
- uva 272 Tex中的引号(Tex Quotes)
TeX is a typesetting language developed by Donald Knuth. It takes source text together with a few ty ...
- react入门----组件的基础用法
1.组件 <!-- React 允许将代码封装成组件(component),然后像插入普通 HTML 标签一样,在网页中插入这个组件.React.createClass 方法就用于生成一个组件类 ...
- shell输出颜色、printf输出颜色
1.echo开启彩色输出: -e 开启echo中的转义: \e或者\033来输出Esc颜色: 恢复默认颜色为:\e[0m; 命令格式: echo -e "\e[字背景颜色:文字颜色m字符串\ ...
- Set Map List Iterator
Set和Map类似,也是一组key的集合,但不存储value.由于key不能重复,所以,在Set中,没有重复的key. Map放没有顺序的键值对,所有键值对 — 参见 entrySet(),所有键 — ...
- HUD 1043 Eight 八数码问题 A*算法 1667 The Rotation Game IDA*算法
先是这周是搜索的题,网站:http://acm.hdu.edu.cn/webcontest/contest_show.php?cid=6041 主要内容是BFS,A*,IDA*,还有一道K短路的,.. ...
- 【BZOJ2434】阿狸的打字机(fail树,DFS序)
题意: 1<=N<=10^5 1<=M<=10^5 输入总长<=10^5 思路: From http://blog.csdn.net/lych_cys/article ...
- 实用型的DJANGO ORM
比较深入一点的内容,需要用时,用心看看. URL: https://www.sitepoint.com/doing-more-with-your-django-models/ https://www. ...
- [bzoj1617][Usaco2008 Mar]River Crossing渡河问题_动态规划
River Crossing渡河问题 bzoj-1617 Usaco-2008 Mar 题目大意:题目链接. 注释:略. 想法:zcs0724出考试题的时候并没有发现这题我做过... 先把m求前缀和, ...