对于一个含有 n+2 个元素的数列,A0,A1,⋯An,满足这样的递归公式
Ai=2Ai−1+Ai+1−Ci 1≤i≤n
现在我们知道 A0,An+1 和 C1,C2,⋯Cn。
现在请你帮忙计算 A1 的值。
输入格式
第一行输入一个整数 n(1≤n≤1000)。
第二行输入两个数 A0 和 An+1,接着是 n 个数据分别是 C1,C2,⋯Cn。所有的数据均是两位小数的浮点数。
输出格式
输出 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
当时做的时候死活不会做..哎.
这道题我们如果采取递推或者dfs,我们会发现是个无限循环,根本找不到答案。我们需要用比较巧妙的方法。
我们假设要求的值为0.
根据公式X(i+1)=2*X(i)+x*C(i)-X(i-1).
我们一直求到Xn+2上。 我们已知Xn+2的值为B了。 我们假设X1=0的情况下Xn+2的值为C。 所以我们相当于多了C-B。 而这C-B应该是由上述公式减去的,如果x1=0,我们找个例子推一下可知,是少加了n+1个。
所以(C-B)/(n+1)就是答案
#include <iostream>
#include <stdio.h>
using namespace std;
double a[1010];
double val[1010];
int main()
{
int n;
int p,q;
cin >> n;
cin >> p >> q;
a[0]= p;
a[1]= 0;
for (int i= 1; i <= n; ++i)
{
cin >> val[i];
}
for (int i= 1; i <= n; ++i)
{
a[i+1]=2.0*a[i]-a[i-1]+2.0*val[i];
}
double ans= (q- a[n + 1]) /(n + 1);
printf("%.2lf\n",ans);
return 0;
}