题目链接
我一开始时的想法是通过解多元一次方程组来求解a1,但我天真的以为只要把方程输进去然后递归就可以了。。。直到考虑是顺序还是逆序,的时候发现不对。
后面查了一下,发现需要进行推导,找到函数的递推关系在做;
代码如下:
/*
因为:Ai=(Ai-1+Ai+1)/2 - Ci,
A1=(A0 +A2 )/2 - C1;
A2=(A1 + A3)/2 - C2 , ...
=> A1+A2 = (A0+A2+A1+A3)/2 - (C1+C2)
=> A1+A2 = A0+A3 - 2(C1+C2)
同理可得:
A1+A1 = A0+A2 - 2(C1)
A1+A2 = A0+A3 - 2(C1+C2)
A1+A3 = A0+A4 - 2(C1+C2+C3)
A1+A4 = A0+A5 - 2(C1+C2+C3+C4)
...
A1+An = A0+An+1 - 2(C1+C2+...+Cn)
----------------------------------------------------- 左右求和
(n+1)A1+(A2+A3+...+An) = nA0 +(A2+A3+...+An) + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)
=> (n+1)A1 = nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)
=> A1 = [nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)]/(n+1)
*/
————————————————
#pragma warning(disable:4996);
#include <iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
double c[3005];
int main()
{
int n;
while (cin >> n)
{
double a0, an1;
cin >> a0 >> an1;
for (int i = 1;i <= n;i++) cin >> c[i];
double ans = n * a0 + an1;
for (int i = 1;i <= n;i++) ans -= 2 * (n - i + 1) * c[i];
ans /= (1 + n);
printf("%.2lf\n", ans);
}
return 0;
}