原题目链接:
http://acm.buaa.edu.cn/problem/759/
#include "stdafx.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
double fun();
int T,i;
cin>>T;
double *S=new double[T];
for(i=0;i<T;i++)
S[i]=fun();
for(i=0;i<T;i++)
cout<<fixed<<setprecision(3)<<S[i]<<endl;
delete[] S;
return 0;
}
double fun()
{
long n,i;
double sum=0;
cin>>n;
long *A=new long[n+1];
long *B=new long[n+1];
B[0]=0;
for(i=1;i<=n;i++)
{
cin>>A[i];
if(i<=(n+1)/2)
B[i]=B[i-1]+n-(i-1)*2;
else
B[i]=B[n+1-i];
}
for(i=1;i<=n;i++)
sum+=A[i]*B[i];
return sum/(n*(n+1)/2);
}
附上测试用例通过源代码,时间复杂度为O(N)。
如果采用任何一种数组的方法,那么时间复杂度都是在o(n^2),编译的结果肯定超时、只有把这个问题彻底转化为数学问题,才能得到解决,下面是xyq大神的解决思路:
通过计算的规律寻找每一个ai的计算的次数Bi,那么通过分析可得到计算次数的迭代公式:B[i]=B[I-1]+n-(i-1)*2、结果关于(n+1)*n/2对称,这样我们要求的sum便是对ai*bi求和即可、