http://acm.timus.ru/problem.aspx?space=1&num=1047
题目翻译
有一个N+2个元素的数列:
a0,a1,⋯,an+1(1≤N≤3000,−2000≤ai≤2000)
,并且满足
ai=12(ai−1+ai+1)−ci(i=1,2,⋯,N)
给定 a0,an+1,c1,⋯,cn ,写一个程序计算 a1 的值。
输入
输入第一行一个整数N,接下来2行包含 a0,an+1 ,均有2位小数,接下来N行每行一个2位小数 ci 。
输出
输出 a1 ,2位小数。
样例输入
1
50.50
25.50
10.15
样例输出
27.85
题解
累加法:
a1a2a3an−1an=12(a0+a2)−c1=12(a1+a3)−c1=12(a2+a4)−c1⋮=12(an−2+an)−cn−1=12(an−1+an+1)−cn
每行相加得
a1+⋯+an=12(a0+⋯+an−1+a2+⋯+an+1)−∑i=1nci
化简得
a1+⋯+an=a2+⋯+an−1+12(a0+a1+an+an+1)−∑i=1nci
移项得
12(a1+an)=12(a0+an+1)−∑i=1nci
乘2得
a1+an=a0+an+1−2∑i=1nci
令 n=1,2,3,⋯ ,有
===na1+a1+a2+⋯+an(a1+a1)+(a1+a2)+⋯+(a1+an)(a0+a2−2∑i=11ci)+(a0+a3−2∑i=12ci)+(a0+a4−2∑i=13ci)+⋯na0+a2+a3+⋯+an+1−2∑j=1n∑i=1jci
有
na1+∑i=1nai=na0+∑i=2nai+an+1−2∑j=1n∑i=1jci
有
(n+1)a1+∑i=1nai=na0+∑i=1nai+an+1−2∑j=1n∑i=1jci
变换为 a1 的表达式,程序得。
// POJ 2601, URAL 1047
#include <cstdio>
int main() {
int n, i;
double a, b, c, ans, sum;
scanf("%d", &n);
scanf("%lf%lf", &a, &b);
sum = 0;
for (i = 0; i < n; ++i) {
scanf("%lf", &c);
sum += (n - i) * c;
}
ans = (n * a + b - 2 * sum) / (n + 1);
printf("%.2lf\n", ans);
return 0;
}