题目:
对于一个含有 n+2个元素的数列,
A
0
、
A
1
、
…
…
、
A
n
+
1
A_{0}、A_{1}、……、A_{n+1}
A0、A1、……、An+1 ,满足这样的递归公式
A
i
=
A
i
−
1
+
A
i
+
1
2
−
C
i
A_{i}=\frac{A_{i-1}+A_{i+1}}{2}-C_{i}
Ai=2Ai−1+Ai+1−Ci
现在我们知道
A
0
、
A
n
+
1
A_{0}、A_{n+1}
A0、An+1和
C
1
、
C
2
、
…
…
、
C
n
C_{1}、C_{2}、……、C_{n}
C1、C2、……、Cn
现在请你帮忙计算
A
1
A_{1}
A1 的值。
输入格式
第一行输入一个整数 n( 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1≤n≤1000)。
第二行输入两个数 A 0 、 A n + 1 A_{0}、A_{n+1} A0、An+1,接着是 n 个数据分别是 C 1 、 C 2 、 … … 、 C n C_{1}、C_{2}、……、C_{n} C1、C2、……、Cn 。所有的数据均是两位小数的浮点数。
输出格式
输出 A 1 A_{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
分析:
由递推公式:
A
i
=
A
i
−
1
+
A
i
+
1
2
−
C
i
A_{i}=\frac{A_{i-1}+A_{i+1}}{2}-C_{i}
Ai=2Ai−1+Ai+1−Ci
A
1
=
A
0
+
A
2
2
−
C
1
A_{1}=\frac{A_{0}+A_{2}}{2}-C_{1}
A1=2A0+A2−C1
A
2
=
A
1
+
A
3
2
−
C
2
⇒
A_{2}=\frac{A_{1}+A_{3}}{2}-C_{2}\Rightarrow
A2=2A1+A3−C2⇒
3
A
2
=
A
0
−
2
(
C
1
+
2
C
2
)
+
2
A
3
3A_{2}=A_{0}-2(C_{1}+2C_{2})+2A_{3}
3A2=A0−2(C1+2C2)+2A3
A
3
=
A
2
+
A
4
2
−
C
3
⇒
A_{3}=\frac{A_{2}+A_{4}}{2}-C_{3}\Rightarrow
A3=2A2+A4−C3⇒
4
A
3
=
A
0
−
2
(
C
1
+
2
C
2
+
3
C
3
)
+
3
A
4
4A_{3}=A_{0}-2(C_{1}+2C_{2}+3C_{3})+3A_{4}
4A3=A0−2(C1+2C2+3C3)+3A4
由以上可以推导出:
(
n
+
1
)
A
n
=
A
0
−
2
F
(
n
)
+
n
A
n
+
1
(n+1)A_{n}=A_{0}-2F(n)+nA_{n+1}
(n+1)An=A0−2F(n)+nAn+1
⇒
\Rightarrow
⇒
A
n
=
A
0
−
2
F
(
n
)
+
n
A
n
+
1
n
+
1
A_{n}=\frac{A_{0}-2F(n)+nA_{n+1}}{n+1}
An=n+1A0−2F(n)+nAn+1
F
(
n
)
=
C
1
+
2
C
2
+
3
C
3
+
…
…
n
C
n
F(n)=C_{1}+2C_{2}+3C_{3}+……nC_{n}
F(n)=C1+2C2+3C3+……nCn
故此向后遍历即可获得
A
1
A_{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;
}