- 数列求值 问答
- 35.92%
- 1000ms
- 262144K
数列求值
对于一个含有 n+2n+2n+2 个元素的数列,A0,A1,⋯AnA_0, A_1, cdots A_nA0,A1,⋯An,满足这样的递归公式
Ai=Ai−1+Ai+12−Ci 1≤i≤ndisplaystyle A_i = frac{A_{i-1} + A_{i + 1}}{2} - C_i 1 le i le nAi=2Ai−1+Ai+1−Ci 1≤i≤n
现在我们知道 A0,An+1A_0, A_{n + 1}A0,An+1 和 C1,C2,⋯CnC_1, C_2, cdots C_nC1,C2,⋯Cn。
现在请你帮忙计算 A1A_1A1 的值。
输入格式
第一行输入一个整数 n(1≤n≤1000)n(1 le n le 1000)n(1≤n≤1000)。
第二行输入两个数 A0A_0A0 和 An+1A_{n+1}An+1,接着是 nnn 个数据分别是 C1,C2,⋯CnC_1,C_2, cdots C_nC1,C2,⋯Cn。所有的数据均是两位小数的浮点数。
输出格式
输出 A1A_1A1 的值,结果保留两位小数。
样例输入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.z, a.w,分别代表已知数和未知数,a.w初始为1,
即可代表x,相当于我们只需记录x前的系数即可。
我是设a[n] = x;其他的已知数的w值均为0,a[n].z = 0, a[n].w = 1.
#include <bits/stdc++.h> using namespace std; typedef struct node{ double z, w; }Node; Node a[1005], c[1005]; Node add(Node x, Node y){ Node ss; ss.z = x.z + y.z; ss.w = x.w + y.w; return ss; } Node jian(Node x, Node y){ Node ss; ss.z = x.z - y.z; ss.w = x.w - y.w; return ss; } int main(){ // std::ios::sync_with_stdio(false); int n; double a0; cin >> n; cin >> a0 >> a[n + 1].z; for(int i = 1; i <= n; i++){ cin >> c[i].z; } a[n].z = 0, a[n].w = 1; for(int i = n; i >= 1; i--){ Node x1 = add(a[i], a[i]); //2a[i] Node x2 = add(c[i], c[i]); //2c[i] Node x3 = add(x1, x2); a[i - 1] = jian(x3, a[i + 1]); } if(a[0].w == 0){ //a[n] = 0; // cout << "an = 0" << endl; a[n].z = x; } else{ double x = (a0 - a[0].z) / a[0].w; a[n].z = x; } for(int i = n; i >= 2; i--){ Node x1 = add(a[i], a[i]); //2a[i] Node x2 = add(c[i], c[i]); //2c[i] Node x3 = add(x1, x2); a[i - 1] = jian(x3, a[i + 1]); } // cout << a[1].z << endl; printf("%.2lf", a[1].z); return 0; }