HYSBZ/BZOJ 1011 [HNOI2008] 遥远的行星 - 模糊答案&暴力
2016-02-03 14:56
411 查看
题目描述
记 fif_i 为第i个行星所受的合力 , gig_i 能给行星 i 施力的编号最大的行星。
(1).gi=⌊a∗i⌋(1).g_i = {\lfloor {a*i} \rfloor}
(2).fi=∑j=1giMi∗Mji−j=Mi∗∑j=1giMji−j(2).f_i = \sum_{j=1}^{g_i} { {M_i *M_j} \over {i-j} }={ M_i } * { \sum_{j=1}^{g_i} {M_j \over {i-j}} }
(3).fi+T=Mi+T∗∑j=1gi+TMji+T−j(3).f_{i+T} = M_{i+T} * { \sum_{j=1}^{g_{i+T}} {M_j \over {i+T-j } } }
=Mi+T∗(∑j=1giMji+T−j+∑j=gi+1gi+TMji+T−j)= M_{i+T} * ({ \sum_{j=1}^{g_{i}} {M_j \over {i+T-j}} + \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
=Mi+T∗(∑j=1giMji−j∗i−ji+T−j+∑j=gi+1gi+TMji+T−j) = M_{i+T} * ({ \sum_{j=1}^{g_{i}} {{ {M_j \over {i-j}} * {{i-j} \over {i+T-j}} }} + \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
=Mi+T∗(∑j=1gifiMi∗i−ji+T−j+∑j=gi+1gi+TMji+T−j) = M_{i+T} * ({ \sum_{j=1}^{g_{i}} {{ {f_i \over M_i} * {{i-j} \over {i+T-j}} }} + \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
≈Mi+T∗(fiMi∗i−12gii+T−12gi+∑j=gi+1gi+TMji+T−j) \approx M_{i+T} * ({{f_i \over M_i} *{{i-{ {1\over2 }g_i}} \over {i+T- { {1\over2 }g_i}}}} + { \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
为了保证不超过5%的精确度,i <=T 的暴力处理 ,其余用推出的递推式 算出。T是自己设定的一个常数。
分析:
纯暴力。记 fif_i 为第i个行星所受的合力 , gig_i 能给行星 i 施力的编号最大的行星。
(1).gi=⌊a∗i⌋(1).g_i = {\lfloor {a*i} \rfloor}
(2).fi=∑j=1giMi∗Mji−j=Mi∗∑j=1giMji−j(2).f_i = \sum_{j=1}^{g_i} { {M_i *M_j} \over {i-j} }={ M_i } * { \sum_{j=1}^{g_i} {M_j \over {i-j}} }
(3).fi+T=Mi+T∗∑j=1gi+TMji+T−j(3).f_{i+T} = M_{i+T} * { \sum_{j=1}^{g_{i+T}} {M_j \over {i+T-j } } }
=Mi+T∗(∑j=1giMji+T−j+∑j=gi+1gi+TMji+T−j)= M_{i+T} * ({ \sum_{j=1}^{g_{i}} {M_j \over {i+T-j}} + \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
=Mi+T∗(∑j=1giMji−j∗i−ji+T−j+∑j=gi+1gi+TMji+T−j) = M_{i+T} * ({ \sum_{j=1}^{g_{i}} {{ {M_j \over {i-j}} * {{i-j} \over {i+T-j}} }} + \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
=Mi+T∗(∑j=1gifiMi∗i−ji+T−j+∑j=gi+1gi+TMji+T−j) = M_{i+T} * ({ \sum_{j=1}^{g_{i}} {{ {f_i \over M_i} * {{i-j} \over {i+T-j}} }} + \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
≈Mi+T∗(fiMi∗i−12gii+T−12gi+∑j=gi+1gi+TMji+T−j) \approx M_{i+T} * ({{f_i \over M_i} *{{i-{ {1\over2 }g_i}} \over {i+T- { {1\over2 }g_i}}}} + { \sum_{j=g_i+1}^{g_{i+T}} {M_j \over {i+T-j } } })
Solution :
O(n2n^2)的肯定过不了,而且题目又说了是模糊答案的,那就模糊答案吧。取平均值,算众数,中位数之类的东西都可以用来估算。为了保证不超过5%的精确度,i <=T 的暴力处理 ,其余用推出的递推式 算出。T是自己设定的一个常数。
#include<cstdio> #include<cmath> #define MAXN 100000 const int T=2000; int n,M[MAXN+10],g[MAXN+10]; double a,f[MAXN+10]; void read() { scanf("%d%lf",&n,&a); for(int i=1;i<=n;i++){ scanf("%d",&M[i]); g[i]=floor(a*i); } } void Violent() { for(int i=ceil(1/a);i<=T;i++){ for(int j=1;j<=g[i];j++) f[i]+=1.0*M[i]*M[j]/(i-j); } } void Obfuscate() { for(int i=T+1;i<=n;i++){ int k=i-T; double t=0; for(int j=g[k]+1;j<=g[i];j++) t+=1.0*M[j]/(i-j); f[i]=1.0*M[i]*(f[k]/(1.0*M[k])*(1.0*k-g[k]/2.0)/(1.0*i-g[k]/2.0) + t); } } int main() { read(); Violent(); Obfuscate(); for(int i=1;i<=n;i++) printf("%.8lf\n",f[i]); }
相关文章推荐
- Bitmap.recycle引发的血案
- Android RecycleView(一)
- C#学习小记
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(7)
- MYSQL获取自增ID的四种方法
- 安装和配置SharePoint 2013 Workflow
- Linux cheat命令
- windows 下搭建react-native android 开发环境
- jQuery 操作列表批量删除数据
- windbg的reload命令
- IIS 静态网站跨域(CORS)
- Win7旗舰版中的IIS配置asp.net的运行环境
- CSS3选择器详解
- 数据管理平台范围
- osgFX实现方式解析
- <<Numerical Analysis>>笔记
- 体验 Java 并发 api,用不同方式实现信号量锁(Semaphore)(6)
- 常用正则表达式(转载)
- MySQL 中隔离级别 RC 与 RR 的区别
- UVa 442 && HDU 1082 Matrix Chain Multiplication【栈】