BZOJ 1011 HNOI2008 遥远的行星 递推

9 篇文章 0 订阅

题目大意:给定一条直线上的一些行星,按照题目要求计算,求每个点所受重力

我没有在标题上写”乱搞“的原因是我看了题解一堆说乱搞的0.0 然后我就真乱搞了0.0 每个点只计算临近的1000个,结果狂WA不止。。。

乱搞肯定过不去 不用想了

其实说是递推比较合适 详细题解见http://hi.baidu.com/zeonsgtr/item/789da6f2838a3dc742c36ab7 我不累述了

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 100100
using namespace std;
int n,t=100,g[M];
double a,mass[M],ans[M];
int main()
{
    int i,j;
    cin>>n>>a;
    for(i=1;i<=n;i++)
    {
        scanf("%lf",&mass[i]);
        g[i]=min(static_cast<int>(i*a+1e-7),n);
    }
    for(i=1;i<=n;i++)
    {
    	if(i<=t)
    	{
			for(j=g[i];j;j--)
          	  ans[i]+=mass[i]*mass[j]/(i-j);
		}
		else
		{
        	ans[i]=mass[i]*ans[i-t]/mass[i-t]*(i-t-g[i-t]/2)/(i-g[i-t]/2);
        	for(j=g[i];j>g[i-t];j--)
        		ans[i]+=mass[i]*mass[j]/(i-j);
		}
    }
    for(i=1;i<=n;i++)
        printf("%.6lf\n",ans[i]);
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值