题目:
现在,11.11在大学生活中是个特殊的日子,很多学校都把它当成男生节,作为师姐,LPT也想给师弟发下福利,可是师弟那么多,如何发?于是她想了一个点子,
可以出一道数学题考考师弟们,前三位AC这道题的师弟就可以得到小礼物啦!
有一组数列,它有n+2个元素,a[0],a[1], ..., a[n+1] (n <= 3000, -10000 <= a[i]<=10000) ,对于i = 1,2,3,...,n满足$a_i-c_i=\frac{a_{i-1}+a_{i+1}}{2}-b_i$,
如果给出a[0],a[n+1] 以及集合B、C的所有元素值(即给出b[1],b[2]...b[n]和c[1],c[2],...,c[n],-100≤b[i], c[i]≤100),都是保留小数点后两位的数,聪明的
你能否算出a[1]?
思路:
首先,常数项可以并在一起,$a_i-c_i=\frac{a_{i-1}+a_{i+1}}{2}-b_i$, 用 $d_i = b_i -c_i$ 把式子变形成:$a_i=\frac{a_{i-1}+a_{i+1}}{2}-d_i$
再次变形:$a_{i+1} - a_i - 2d_i = a_i - a_{i-1}$ ··· (1)
然后,i = 1开始,到i = n,根据公式得到 n个式子:
$a_2 - a_1 - 2d_1 = a_1 - a_0$
$a_3 - a_2 - 2d_2 = a_2 - a_1$
···
$a_{n+1} - a_n - 2d_n = a_n - a_{n-1}$
把这n个式子累加,得到
$a_0 - a_1 + a_{n+1} - a_n - 2 * \sum^{n}_{i = 1}d_i = 0$ ··· (2)
由式(1)可得
$a_{n+1} - a_n - 2d_n= a_n - a_{n-1}$
代入(2)可得代入
$ a_0 - a_1 + a_n - a_{n-1} - 2 *\sum^{n-1}_{i = 1}d_i=0$ ··· (3)
重复,得到:
$a_0 - a_1 + a_2 - a_1 - 2d_1 = 0$ ··· (n+1)
将式(2)加到式子(n+1),得:
$a_1=\frac{n*a_0 + a_{n+1} - 2 * n * d_1 - 2 * (n-1) * d_2 - ··· - 2 * d_n}{n+1}$
代码:
1 #include<cstdio> 2 int main() 3 { 4 //freopen("data_in.txt", "r", stdin); 5 //freopen("data_out.txt", "w", stdout); 6 int n, i, T; 7 double a1, x, y, b[3010], c[3010], d[3010], sum; 8 scanf("%d", &T); 9 while(T--) 10 { 11 sum = 0.0; 12 scanf("%d", &n); 13 scanf("%lf%lf", &x, &y); 14 for(i = 1; i <= n; i++) 15 { 16 scanf("%lf", &b[i]); 17 } 18 for(i = 1; i <= n; i++) 19 { 20 scanf("%lf", &c[i]); 21 d[i] = b[i] - c[i]; 22 } 23 for(i = 1; i <= n; i++) 24 { 25 sum += 2 * (n - i + 1) * d[i]; 26 } 27 a1 = (n * x - sum + y) / ( n + 1); 28 printf("%.2lf\n", a1); 29 } 30 31 return 0; 32 }