题目:
对于一个含有 n+2个元素的数列,A0、A1、……、An+1A_{0}、A_{1}、……、A_{n+1}A0、A1、……、An+1 ,满足这样的递归公式
Ai=Ai−1+Ai+12−CiA_{i}=\frac{A_{i-1}+A_{i+1}}{2}-C_{i}Ai=2Ai−1+Ai+1−Ci
现在我们知道 A0、An+1A_{0}、A_{n+1}A0、An+1和C1、C2、……、CnC_{1}、C_{2}、……、C_{n}C1、C2、……、Cn
现在请你帮忙计算 A1A_{1}A1 的值。
输入格式
第一行输入一个整数 n(1≤n≤10001 \leq n \leq 10001≤n≤1000)。
第二行输入两个数 A0、An+1A_{0}、A_{n+1}A0、An+1,接着是 n 个数据分别是 C1、C2、……、CnC_{1}、C_{2}、……、C_{n}C1、C2、……、Cn 。所有的数据均是两位小数的浮点数。
输出格式
输出 A1A_{1}A1 的值,结果保留两位小数。
样例输入1
1
50.50 25.50
10.15
样例输出1
27.85
样例输入2
2
-756.89 52.52
172.22 67.17
样例输出2
-761.49
分析:
由递推公式:Ai=Ai−1+Ai+12−CiA_{i}=\frac{A_{i-1}+A_{i+1}}{2}-C_{i}Ai=2Ai−1+Ai+1−Ci
A1=A0+A22−C1A_{1}=\frac{A_{0}+A_{2}}{2}-C_{1}A1=2A0+A2−C1
A2=A1+A32−C2⇒A_{2}=\frac{A_{1}+A_{3}}{2}-C_{2}\RightarrowA2=2A1+A3−C2⇒ 3A2=A0−2(C1+2C2)+2A33A_{2}=A_{0}-2(C_{1}+2C_{2})+2A_{3}3A2=A0−2(C1+2C2)+2A3
A3=A2+A42−C3⇒A_{3}=\frac{A_{2}+A_{4}}{2}-C_{3}\RightarrowA3=2A2+A4−C3⇒ 4A3=A0−2(C1+2C2+3C3)+3A44A_{3}=A_{0}-2(C_{1}+2C_{2}+3C_{3})+3A_{4}4A3=A0−2(C1+2C2+3C3)+3A4
由以上可以推导出:
(n+1)An=A0−2F(n)+nAn+1(n+1)A_{n}=A_{0}-2F(n)+nA_{n+1}(n+1)An=A0−2F(n)+nAn+1
⇒\Rightarrow⇒An=A0−2F(n)+nAn+1n+1A_{n}=\frac{A_{0}-2F(n)+nA_{n+1}}{n+1}An=n+1A0−2F(n)+nAn+1
F(n)=C1+2C2+3C3+……nCnF(n)=C_{1}+2C_{2}+3C_{3}+……nC_{n}F(n)=C1+2C2+3C3+……nCn
故此向后遍历即可获得A1A_{1}A1的值。
AC代码:
#include<bits/stdc++.h>
using namespace std;
double e[1010],dp[1010],f[1010];
int n;
int main(){cin>>n;cin>>f[0]>>f[n+1];for(int i=1;i<=n;i++)cin>>e[i];dp[1]=e[1];for(int i=2;i<=n;i++)dp[i]=dp[i-1]+i*e[i];for(int i=n;i>=1;i--)f[i]=(f[0]-2*dp[i]+i*f[i+1])/(i+1);printf("%.2f\n",f[1]);//cout<<f[1]<<endl;return 0;
}