BZOJ1011 HNOI2008 遥远的行星 其他

题意:直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量。请计算每颗行星的受力,只要结果的相对误差不超过5%即可.

题解:出题人脑子有坑系列。完全没见过这么扯的题目,因为${F_j} = \sum\limits_{k = 1}^{\left\lfloor {aj} \right\rfloor } {\frac{{{m_j}{m_k}}}{{j - k}}} $,而且允许很大的误差,则当j>某个值时,取$k - j = j - \frac{{\left\lfloor {aj} \right\rfloor }}{2}$,那么直接用前缀和维护即可。

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
#define eps 1e-8

const int U=2000;
const int MAXN=100000+2;
int N;
double a,m[MAXN],s[MAXN],ans,x,y,z;

int main(){
    scanf("%d %lf",&N,&a);
    for(int i=1;i<=N;i++) scanf("%lf",m+i),s[i]=s[i-1]+m[i];

    for(int i=1,j;i<=N;i++){
        x=i,j=(int)(a*x+eps),y=j,ans=0;

        if(j<=U)
            for(int k=j;k;k--) z=k,ans+=m[k]*m[i]/(x-z);
        else ans=s[j]*m[i]/(x-y/2);

        printf("%.6lf\n",ans);
    }

    return 0;
}
View Code

 

posted @ 2017-02-26 01:59  WDZRMPCBIT  阅读(100)  评论(0编辑  收藏  举报