BZOJ1011 HNOI2008 遥远的行星 其他

针对一个特殊的物理模型,本文档介绍了一种计算直线上多个行星间相互作用力的方法。通过利用前缀和优化计算过程,确保了计算效率,并允许一定的误差范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意:直线上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

 

转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6443503.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值