zoukankan      html  css  js  c++  java
  • 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≤ndisplaystyle 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;
    } 
    

      

  • 相关阅读:
    day36 08-Hibernate抓取策略:批量抓取
    day36 07-Hibernate抓取策略:many-to-one上的抓取策略
    day36 06-Hibernate抓取策略:set集合上的抓取策略
    day36 05-Hibernate检索方式:离线条件查询
    day36 04-Hibernate检索方式:多表连接查询
    day36 03-Hibernate检索方式:排序、参数绑定、投影查询
    【收集】11款Linux数据恢复工具
    【收集】11款Linux数据恢复工具
    7个免费的Linux FTP客户端工具
    7个免费的Linux FTP客户端工具
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/8532028.html
Copyright © 2011-2022 走看看