您的位置:首页 > 其它

POJ 2601|URAL 1047|Simple Caluculations|数学推导

2017-10-17 19:29 246 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: