CodeVS3785 项链
2015-09-14 22:02
183 查看
http://codevs.cn/problem/3785/
题意:有一个数列E[1]…E
,当1<i<n时,有E[i]=(E[i-1]+E[i+1])/2+D[i]。
现给定E[1],E
以及D[2]…D[n-1],求出完整的E数列。n<=500,000。
由于中间的E[2]…E[n-1]未知,当n>3时没有任何某两个下标差为1或2的已知E值,因此无法直接计算。
我们可以用方程的思想来解决,设E[2]=x,这样联系E[1]和D[2]就可以用x表示出E[3],并且不断利用D表示出E的每一项。
于是我们可以得到一个E
=f(x)的方程,并且容易发现这个方程是一次的,直接求解,然后依次返回代入或直接根据相邻项递推即可。
进一步发现,在E
=f(x)=kx+b中,k一定等于n-1,这点可以用归纳法证明,因而我们也不用存k了。
程序写起来其实只有十余行,但是具体算法还是有一定思维难度的。
代码:
题意:有一个数列E[1]…E
,当1<i<n时,有E[i]=(E[i-1]+E[i+1])/2+D[i]。
现给定E[1],E
以及D[2]…D[n-1],求出完整的E数列。n<=500,000。
由于中间的E[2]…E[n-1]未知,当n>3时没有任何某两个下标差为1或2的已知E值,因此无法直接计算。
我们可以用方程的思想来解决,设E[2]=x,这样联系E[1]和D[2]就可以用x表示出E[3],并且不断利用D表示出E的每一项。
于是我们可以得到一个E
=f(x)的方程,并且容易发现这个方程是一次的,直接求解,然后依次返回代入或直接根据相邻项递推即可。
进一步发现,在E
=f(x)=kx+b中,k一定等于n-1,这点可以用归纳法证明,因而我们也不用存k了。
程序写起来其实只有十余行,但是具体算法还是有一定思维难度的。
代码:
var e,d,b:array[0..500020]of double; n,i,l,r,m:longint; begin readln(n,e[1],e ); for i:=2 to n-1 do read(d[i]); b[2]:=0; b[3]:=(b[2]-d[2])*2-e[1]; for i:=4 to n do b[i]:=(b[i-1]-d[i-1])*2-b[i-2]; e[2]:=(e -b )/(n-1); for i:=3 to n do e[i]:=(e[i-1]-d[i-1])*2-e[i-2]; for i:=1 to n do write(e[i]:0:0,' '); end.
相关文章推荐
- Android学习——Tween动画
- Android 网络通信——HttpURLConnection
- 计算字符串长度
- HDU4403 A very hard Aoshu problem DFS
- GridAdaptedFeatureDetector 编译错误定位
- #define
- Makefile工程文件
- Android 中的inflate转自安卓中文网作者:kezz 来源:Android中文网
- 【面试题17】将两个有序的链表合并
- 补给站
- Linux 下编译、安装、配置 QT
- python math模块
- PHP系统常量&&魔术常量
- docker 搭建私有仓库及镜像存储目录结构
- 第101讲:使用SBT开发Akka第一个案例源码解析MapActor、ReduceActor、AggregateActor学习笔记
- 水平垂直投影
- RMQ和LCA总结
- java 转义字符
- 网易新闻优化APK下载链接
- JavaScript小笔记