标签: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