bzoj1011-HNOI2008 遥远的行星 其他

  • 题面描述

    • 直线上\(N\)颗行星,\(X=i\)处有行星\(i\),行星\(j\)受到行星\(i\)的作用力,当且仅当\(i<=A_j\)。此时J受到作用力的大小为\(F_{i\to j}=\frac{Mi*Mj}{j-i}\) 其中\(A\)为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用。请计算每颗行星的受力,只要结果的相对误差不超过5%即可.
  • 输入格式

    • 第一行两个整数\(N\)\(A\)\(1\leq N\leq10^5,0.01<a\leq 0.35\),接下来\(N\)行输入\(N\)个行星的质量\(M_i\),保证\(0\leq M_i\leq 10^7\)
  • 输出格式

    • \(N\)行,依次输出各行星的受力情况
  • 题解

    • 这种题根本没意义

    • 注意到题目中有 误差\(\leq 5\%\) 的字眼,因此当我们枚举的\(i\)相当大后,我们便不必精确计算,而只要预估即可

    • \(i\leq10^3\)时,我们按照题面给出的计算式 计算。

    • \(i\geq 10^3\)

      • \[ \sum_{j=1}^r \frac{M_j*M_i}{i-j}\\ \approx\sum_{j=1}^r \frac{M_j*M_i}{i-0.5*r}\\ =\frac{sum_j*M_i}{i-0.5*r}\ (sum_j=\sum_{x=1}^j M_x) \]
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=1e5+5;
const double eps=1e-8;
int n;
double a,m[MAXN],s[MAXN];
int main(){
    scanf("%d%lf",&n,&a);
    for (int i=1;i<=n;i++) scanf("%lf",&m[i]);
    for (int i=1;i<=n;i++){
        s[i]=s[i-1]+m[i];
        int r=(int)floor(i*a+eps);
        double ret=0;
        if (i<=1000){
            for (int j=1;j<=r;j++) ret+=m[j]*m[i]/(double)(i-j);
        }
        else ret=s[r]*m[i]/(i-0.5*r);
        printf("%.6lf\n",ret);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/shjrd-dlb/p/10741517.html