标签:des style blog http color io os ar java


2 3 2 -1 0 1 4 2 -2 -1 1 2
0 0.5
题解及代码:
现场赛的时候,以为是一个贪心,策略搞了半天,也没能ac,绝望之时把o(nk)的暴力对拍程序交了一发,ac了.....无语,可能是时限开的比较大的缘故吧。
之后推了推公式,发现是一个非常简单的数学题目,只要o(n)的复杂度就可以了。
推导过程见:点击打开链接
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
long long s[50050];
//对拍程序,请忽略
void solve(int n,int k)
{
double sum=0;
for(int i=1;i<=k;i++)
{
sum+=s[i];
}
int l=1,r=k;
double ans=-1;
for(int i=k;i<=n;i++)
{
double avg=sum/k,t=0;
for(int j=l;j<=r;j++)
{
t+=(s[j]-avg)*(s[j]-avg);
}
l++,r++;
sum=sum-s[l-1]+s[r];
if(i==k||ans>t) ans=t;
}
printf("%.12lf\n",ans);
}
int main()
{
int cas,n,k;
scanf("%d",&cas);
while(cas--)
{
long long suml=0,sumr=0,ans=-1,t=0;
scanf("%d%d",&n,&k);
k=n-k;
for(int i=1;i<=n;i++)
{
scanf("%I64d",&s[i]);
}
if(k==0||k==1)
{
printf("0.000000000000\n");
continue;
}
s[n+1]=0;
sort(s+1,s+n+1);
for(int i=1;i<=k;i++)
{
suml=suml+s[i],sumr=sumr+s[i]*s[i];
}
for(int i=k;i<=n;i++)
{
t=sumr*k-suml*suml;
if(i==k||ans>t) ans=t;
suml=suml-s[i-k+1]+s[i+1];
sumr=sumr-s[i-k+1]*s[i-k+1]+s[i+1]*s[i+1];
}
//solve(n,k);
printf("%.12lf\n",(double)ans/(double)k);
}
return 0;
}
标签:des style blog http color io os ar java
原文地址:http://blog.csdn.net/knight_kaka/article/details/40381689