bzoj1011

题目真是没谁了??~~看了半天,交完后发现自己比别的大佬慢了好多,于是去借鉴了一下,然后发现由于精度我们可以卡一下~~

      对于星球j,我们要求的和式为ik=1mkmjjk

  当j很大时,i也不会太大,我们可以把式子化成ik=1mkmjj0.5i

  用sumi表示前i个星球的质量和,那么和式可以化成sumimjj0.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;
}
View Code

 

posted @ 2017-10-24 00:10  新手-周  阅读(159)  评论(0编辑  收藏  举报