63-数列求值

  1. 数列求值 问答
编辑代码
  • 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≤n\displaystyle A_i = \frac{A_{i-1} + A_{i + 1}}{2} - C_i\ \ \ 1 \le i \le nAi=2Ai1+Ai+1Ci   1in

 

现在我们知道 A0,An+1A_0, A_{n + 1}A0,An+1C1,C2,⋯CnC_1, C_2, \cdots C_nC1,C2,Cn

现在请你帮忙计算 A1A_1A1 的值。

输入格式

第一行输入一个整数 n(1≤n≤1000)n(1 \le n \le 1000)n(1n1000)。

第二行输入两个数 A0A_0A0An+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;
} 

  

转载于:https://www.cnblogs.com/zhumengdexiaobai/p/8532028.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值