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将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死 ...
随机推荐
- vue基础---表单输入绑定
[一]基础用法 用 v-model 指令在表单 <input>.<textarea> 及 <select> 元素上创建双向数据绑定.它会根据控件类型自动选取正确的方 ...
- ThinkPHP---layer插件
[概论] (1)layer是基于jquery开发的一款美化弹框的插件,主要用于弹框效果的交互.但其他功能和组件也日益完善 官网:http://layer.layui.com 在线手册:http://w ...
- EasyUI_datagrid
案例一丶jquery.easyui.min.js:10631 Uncaught TypeError: this.renderEmptyRow is not a function 解决方法:datagr ...
- Spring Boot 与任务
一.任务 1.异步任务 package com.yunche.task.service; import org.springframework.stereotype.Service; /** * @C ...
- JAVA基础——IO流字节流
在Java中把不同的输入输出源(键盘.文件.网路连接)抽象表述为“流”. 1.输入流.输出流 .字节输入流通过FileInputStream和来操作 字节输出流通过FileOutputStream来操 ...
- 洛谷——P2090 数字对
P2090 数字对 题目描述 对于一个数字对(a, b),我们可以通过一次操作将其变为新数字对(a+b, b)或(a, a+b). 给定一正整数n,问最少需要多少次操作可将数字对(1, 1)变为一个数 ...
- ZOJ - 3983 - Crusaders Quest(思维 + 暴力)
题意: 给出一个字符串,长度为9,包含三种各三个字母"a","g","o",如果一次消除连续三个一样的分数+1,消完自动向左补齐 其中可以消 ...
- FileWriter实现从一个文件中读取内容并写到另一个文件中
FileWriter和FileOutputStream都是向文件写内容,区别是前台一次写一个字符,后者一次写一个字节 package com.janson.day20180827; import ja ...
- Swing之登录界面
import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Login extends JFrame ...
- lombok 插件安装
1. 下载地址: https://plugins.jetbrains.com/plugin/6317-lombok-plugin 2. 选择从本地安装.