您的位置:首页 > 其它

【JZOJ 4585】Robert 的军队

2016-07-08 12:57 302 查看

Description



Solution

首先有一个证明: 一列数的方差如果再加上一个数,方差并不会更优。

感性上感觉没有问题,

理性证明:留给读者们思考(提示:设加上一个数后的平均数加上了q,带入方差式并化简)。

所以,只要选L个即可,爱咋搞炸搞,

复杂度:O(n)

Code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define sqr(a) ((a)*(a))
using namespace std;
typedef long long LL;
typedef double db;
const int N=100500;
const LL INF=9223372036854775800;
int read(int &n)
{
char ch=' ';int q=0,w=1;
for(;(ch!='-')&&((ch<'0')||(ch>'9'));ch=getchar());
if(ch=='-')w=-1,ch=getchar();
for(;ch>='0' && ch<='9';ch=getchar())q=q*10+ch-48;n=q*w;return n;
}
int m,n,L,R;
LL a
,c
;
db b
;
db ans;
int main()
{
freopen("army.in","r",stdin);
freopen("army.out","w",stdout);
int q;
read(n),read(L),read(R);
fo(i,1,n)a[i]=read(q);
sort(a+1,a+1+n);
fo(i,1,n)b[i]=b[i-1]+sqr(a[i]),c[i]=c[i-1]+a[i];
ans=INF;
fo(i,1,n-L+1)
{
db q=b[i+L-1]-b[i-1],w=c[i+L-1]-c[i-1];
db av=1.0*(w)/L;
ans=min(ans,1.0*(q-2*av*w+av*av*L)/L);
}
printf("%.3lf",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: