bzoj1011
题目真是没谁了??~~看了半天,交完后发现自己比别的大佬慢了好多,于是去借鉴了一下,然后发现由于精度我们可以卡一下~~
对于星球j,我们要求的和式为i∑k=1mk∗mjj−k
当j很大时,i也不会太大,我们可以把式子化成i∑k=1mk∗mjj−0.5i
用sumi表示前i个星球的质量和,那么和式可以化成sumi∗mjj−0.5i
这样我们就可以少用一个变量k,复杂度就降为了
----转自CtrlCV
代码
#include <stdio.h> #include <algorithm> #include <cstring> #include <cmath> #include <queue> #include <vector> using namespace std; const int maxn=100000+10; double m[maxn],sum[maxn]; int main() { int n; double a,ans; scanf("%d%lf",&n,&a); for(int j=1;j<=n;j++) { int i=(int)(a*j+1e-8); scanf("%lf",&m[j]); ans=0; if(j<=500) for(register int k=1;k<=i;k++) ans+=m[k]*m[j]/(j-k); else ans=sum[i]*m[j]/(j-i/2); printf("%lf\n",ans); sum[j]=sum[j-1]+m[j]; } return 0; }