这真是一道坑爹的题目啊
,虽然我猜到怎么做了,但是还是不会搞。
设f[i]表示第i个行星所受的引力,g[i]表示第i个行星所受引力的最后来源行星。
则:
注意到题目中说了误差允许在百分之五之内,所以我们考虑f[i+t]与f[i]的关系。
由于:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cstdio>
using namespace std;
#define maxn 110000
#define eps 1e-8
double f[maxn];
double m[maxn],sum[maxn];
double a;
int n;
void init()
{
scanf("%d%lf",&n,&a);
for(int i=1;i<=n;i++)
{
scanf("%lf",&m[i]);
sum[i]=sum[i-1]+m[i];
}
}
void solve()
{
for(int i=min(1500,n);i;i--)
{
int k=(int)(a*i);
if(fabs((double)(k+1)/a-i)<eps) k++;
for(int j=1;j<=k;j++)
f[i]=f[i]+m[i]*m[j]/(double)(i-j);
}
for(int i=1501;i<=n;i++)
{
int k=(int)(a*i),mid=(1+k)>>1;
f[i]=sum[k]*m[i]/(double)(i-mid);
}
}
int main()
{
init();
solve();
for(int i=1;i<=n;i++)
printf("%lf\n",f[i]);
return 0;
}

本文针对一道涉及引力计算的复杂问题进行了解析,介绍了如何通过计算每个行星受到的引力及其来源来解决问题。考虑到允许的误差范围,文章提出了一种有效的算法实现,并通过具体的代码实现了这一解决方案。
951

被折叠的 条评论
为什么被折叠?



