【JZOJ4585】Robert 的军队

Description

【JZOJ4585】Robert 的军队_第1张图片

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[N],c[N];
db b[N];
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;
}

你可能感兴趣的:(结论题)