2018 蓝桥杯省赛 A 组模拟赛(一)数列求值+推导

题目:

对于一个含有 n+2个元素的数列, A 0 、 A 1 、 … … 、 A n + 1 A_{0}、A_{1}、……、A_{n+1} A0A1An+1 ,满足这样的递归公式
A i = A i − 1 + A i + 1 2 − C i A_{i}=\frac{A_{i-1}+A_{i+1}}{2}-C_{i} Ai=2Ai1+Ai+1Ci
现在我们知道 A 0 、 A n + 1 A_{0}、A_{n+1} A0An+1 C 1 、 C 2 、 … … 、 C n C_{1}、C_{2}、……、C_{n} C1C2Cn
现在请你帮忙计算 A 1 A_{1} A1 的值。

输入格式

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

第二行输入两个数 A 0 、 A n + 1 A_{0}、A_{n+1} A0An+1,接着是 n 个数据分别是 C 1 、 C 2 、 … … 、 C n C_{1}、C_{2}、……、C_{n} C1C2Cn 。所有的数据均是两位小数的浮点数。

输出格式

输出 A 1 A_{1} 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

分析:

由递推公式: A i = A i − 1 + A i + 1 2 − C i A_{i}=\frac{A_{i-1}+A_{i+1}}{2}-C_{i} Ai=2Ai1+Ai+1Ci
A 1 = A 0 + A 2 2 − C 1 A_{1}=\frac{A_{0}+A_{2}}{2}-C_{1} A1=2A0+A2C1
A 2 = A 1 + A 3 2 − C 2 ⇒ A_{2}=\frac{A_{1}+A_{3}}{2}-C_{2}\Rightarrow A2=2A1+A3C2 3 A 2 = A 0 − 2 ( C 1 + 2 C 2 ) + 2 A 3 3A_{2}=A_{0}-2(C_{1}+2C_{2})+2A_{3} 3A2=A02C1+2C2+2A3
A 3 = A 2 + A 4 2 − C 3 ⇒ A_{3}=\frac{A_{2}+A_{4}}{2}-C_{3}\Rightarrow A3=2A2+A4C3 4 A 3 = A 0 − 2 ( C 1 + 2 C 2 + 3 C 3 ) + 3 A 4 4A_{3}=A_{0}-2(C_{1}+2C_{2}+3C_{3})+3A_{4} 4A3=A02C1+2C2+3C3+3A4
由以上可以推导出:
( n + 1 ) A n = A 0 − 2 F ( n ) + n A n + 1 (n+1)A_{n}=A_{0}-2F(n)+nA_{n+1} n+1An=A02F(n)+nAn+1
⇒ \Rightarrow A n = A 0 − 2 F ( n ) + n A n + 1 n + 1 A_{n}=\frac{A_{0}-2F(n)+nA_{n+1}}{n+1} An=n+1A02F(n)+nAn+1
F ( n ) = C 1 + 2 C 2 + 3 C 3 + … … n C n F(n)=C_{1}+2C_{2}+3C_{3}+……nC_{n} F(n)=C1+2C2+3C3+nCn
故此向后遍历即可获得 A 1 A_{1} A1的值。

AC代码:

#include<bits/stdc++.h>
using namespace std;
double e[1010],dp[1010],f[1010];
int n;
int main(){
    cin>>n;
    cin>>f[0]>>f[n+1];
    for(int i=1;i<=n;i++)
        cin>>e[i];
    dp[1]=e[1];
    for(int i=2;i<=n;i++)
        dp[i]=dp[i-1]+i*e[i];
    for(int i=n;i>=1;i--)
        f[i]=(f[0]-2*dp[i]+i*f[i+1])/(i+1);
    printf("%.2f\n",f[1]);
    //cout<<f[1]<<endl;
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值