您的位置:首页 > 其它

2018 蓝桥杯省赛 B 组模拟赛(一)-数列求值

2018-01-22 09:32 295 查看
对于一个含有 n+2n+2 个元素的数列,A_0,
A_1, \cdots A_nA0​,A1​,⋯An​,满足这样的递归公式

\displaystyle
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

现在我们知道 A_0,
A_{n + 1}A0​,An+1​ 和 C_1,
C_2, \cdots C_nC1​,C2​,⋯Cn​。

现在请你帮忙计算 A_1A1​ 的值。


输入格式

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

第二行输入两个数 A_0A0​ 和 A_{n+1}An+1​,接着是 nn 个数据分别是 C_1,C_2,
\cdots C_nC1​,C2​,⋯Cn​。所有的数据均是两位小数的浮点数。


输出格式

输出 A_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

当时做的时候死活不会做..哎.

这道题我们如果采取递推或者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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: