链接:数列求值
Description
对于一个含有 n+2个元素的数列A0, A1, ... , An,满足这样的递归公式: Ai = (Ai-1 + Ai+1) /2 - Ci 1≤i≤n
现在我们知道A0, An+1和C1, C2, ... , Cn
现在请你帮忙计算A1的值。
Input
第一行输入一个整数n(1≤n≤1000)。
第二行输入两个数A0, An+1,接着是 n个数据分别是C1, C2, ... , Cn。所有的数据均是两位小数的浮点数。
Output
输出A1的值,结果保留两位小数。
Sample Input
1
50.50 25.50
10.15
2
-756.89 52.52
172.22 67.17
Sample Output
27.85
-761.49
题解
根据公式可以推导出
A(2)==2*A(1)-A(0)+2*C(1) 先不看后面的C
A(3)==2*A(2)-A(1)==3*A(1)-2*A(0)
.
.
.
A(n+1)==(n+1)*A(1)-(n)*A(0)
由于我们已知A(n+1) 看起来好像只需要这个公式就可以求出A(1) 然而还有我们忽略的C
由于未知A(1) 先将A(1)看成0 然后根据这个式子地推出A(n+1)暂时命名为tp,跟正确的A(n+1)相差的只有(n+1)*A(1)
剩下的就不用说了吧。。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,x,y) for(register int i=x;i<=y;++i)
#define repd(i,x,y) for(register int i=x;i>=y;--i)
#define ll long long
using namespace std;
const int N=1e3+11;
int n;
double tp,f[N],c;
int main(){
cin>>n;
cin>>f[0]>>tp;
rep(i,2,n+1){
cin>>c;
f[i]=2*f[i-1]-f[i-2]+2*c;
}
printf("%.2lf\n",(tp-f[n+1])/(n+1));
return 0;
}