【乱搞】【HNOI 2008】【bzoj 1011】遥远的行星
2015-08-29 09:22
309 查看
1011: [HNOI2008]遥远的行星
[code]Time Limit: 10 Sec Memory Limit: 162 MBSec Special Judge Submit: 2640 Solved: 954
Description
直线上N颗行星,X=i处有行星i,行星J受到行星I的作用力,当且仅当i<=AJ.此时J受到作用力的大小为 Fi->j=Mi*Mj/(j-i) 其中A为很小的常量,故直观上说每颗行星都只受到距离遥远的行星的作用。请计算每颗行星的受力,只要结果的相对误差不超过5%即可.
Input
第一行两个整数N和A. 1<=N<=10^5.0.01< a < =0.35
接下来N行输入N个行星的质量Mi,保证0<=Mi<=10^7
Output
N行,依次输出各行星的受力情况
Sample Input
[code]5 0.3 3 5 6 2 4
Sample Output
[code]0.000000 0.000000 0.000000 1.968750 2.976000
HINT
[code]精确结果应该为0 0 0 2 3,但样例输出的结果误差不超过5%,也算对
题解:
乱搞。。
你有没有觉得5%的误差允许有些奇怪?我觉得奇怪然而并没有想到怎么做,后来在sunshine大神的指导下发现可以模糊一下分母,只需要去个中位数就好了。
Code:
[code]#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define N 100100 int n; double a,m ,s ,ans ; int main(){ scanf("%d%lf",&n,&a); for (int i=1; i<=n; i++) scanf("%lf",&m[i]); ans[1]=0.0; int j=0; for (int i=2; i<=min(5000,n); i++){ if ((double)(a*i)+1e-6>=(double)(j+1.0)) j++; for (int k=1; k<=j; k++) ans[i]+=(m[i]*m[k])/(double)(i-k); } s[0]=0.0; for (int i=1; i<=n; i++) s[i]=s[i-1]+m[i]; for (int i=5001; i<=n; i++){ if ((double)(a*i)+1e-6>=(double)(j+1.0)) j++; ans[i]=(m[i]*s[j])/(double)(i-(int)(j/2.0)); } for (int i=1; i<=n; i++) printf("%0.6lf\n",ans[i]); return 0; }
相关文章推荐
- nohup程序后台执行
- nginx(1)
- android lint 去除无用的资源
- SDUT3303 来发背包开开胃(模拟背包) ,DFS
- html5中canvas 错误集锦1(8.28)
- Qt学习之路【2】:调用父类构造函数
- Sublime Text : 创建工程
- Robberies(逆向思维转换+01背包好题)
- (转)关于SLG游戏引入兰切斯特方程的设想
- ios常用到的第三方库
- Linux_2day------------搭建mysql服务器
- Linux下出现 error: mysql.h: No such file or directory 的解决办法
- 使用VS2010创建WebService 发布、测试
- MEF
- 为什么面试总喜欢考算法题?
- EF导航属性真分页查询
- Windows之安装Nginx、PHP、mysql
- iOS开发——源代码管理——svn 命令行下常用的几个命令
- fork source exec区别
- 文章标题