【jzoj4585】【Robert 的军队】

来源:互联网 发布:欧树洁面凝胶知乎 编辑:程序博客网 时间:2024/04/29 22:24

题目大意

给出长度为n的序列,求一个长度在[l,r]之内的字串,满足方差最小,求最小的方差。

题解

有一个显然的结论,解的长度一定为l,然而我不会证,就这就可以乱搞了。

code

#include<set>#include<cmath>#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,j,k) for(int i=j;i<=k;i++)#define fd(i,j,k) for(int i=j;i>=k;i--)using namespace std;int const maxn=100000,inf=2147483647;int n,m,l,r;long long a[maxn+10];double s[maxn+10],ss[maxn+10];double count(int i,int j){    double pj=(s[j]-s[i-1])/(j-i+1);    return (ss[j]-ss[i-1])/(j-i+1)-pj*pj;}int main(){    //freopen("army.in","r",stdin);    //freopen("army.out","w",stdout);    freopen("d.in","r",stdin);    freopen("d.out","w",stdout);    scanf("%d%d%d",&n,&l,&r);    fo(i,1,n)        scanf("%lld",&a[i]);    sort(a+1,a+n+1);    fo(i,1,n)        s[i]=s[i-1]+a[i],ss[i]=ss[i-1]+a[i]*a[i];    double ans=inf;    fo(i,1,n){        if(i<l)continue;        ans=min(ans,count(i-l+1,i));    }    printf("%.3lf",ans);    return 0;}
0 0
原创粉丝点击