說實話,這個題不是我親自推算出來。一直想到崩潰了,明知道只差一步,硬是無法想出來。實在想不出了,看了下別人解題報告上
的解釋。真的很慚愧很崩潰。。。這就是一個數列推理的題目吧。
給出一個數列ci(1<=ci<=n),然后給出數列ai中的a0和a(n+1)。并給出一個公式ai = ( a(i-1) + a(i+1) ) / 2 - ci。題目的意思
是讓求a1。大家在很久以前的高中時代一定做過很多的數列題,所以我一看到這個題還是感覺很親切的。然后就開始推算。我把上面那
個公式,從i==1到i==n,全部累加起來。消去2邊一樣的項,得到一個結果
a1 + an = a0 + a(n+1) - 2 Σci(1<=i<=n)。從這
個公式,我只能得到a1和an 的和。想來想去都無法直接求出a1的值。但是,我也知道如果能求出a1,那么ai中的任何其它項都是能求
出來的。我猜想a1和an相等,提交當然wa了。然后,我猜想ai是a0和a(n+1)的i分點,提交還是wa了。后面這個猜想倒是合理點,但是
還是有不嚴謹的地方,因為那樣,a1的值之和a0,a(n+1),c1這三個值有關系了。
這個題其實以前我想了一下,沒想出來。然后今天重新想的時候可能受以前的影響,限制了一個思路。那就是,再對式子a1 + an =
a0 + a(n+1) - 2 Σci(1<=i<=n)進行累加。其實,也有a1 + a(n-1) = a0 + an - 2 Σci(1<=i<=n-1)。這樣累加n次,剛好可以把
a2-an全部消去。可以得到,一個式子(n+1)a1 = n * a0 + a(n+1)- 2 ΣΣ cj(1<=j<=i) (1<=i<=n)。那么就可以直接求出a1了。
公式:
代碼如下:
#include <stdio.h>
#include <string.h>
int main()
{
int nCases;
int nN;
double a0, an1;
double a1;
double ci[3000 + 10];
double c;
double sum;
scanf("%d", &nCases);
while (nCases--)
{
scanf("%d", &nN);
scanf("%lf%lf", &a0, &an1);
sum = 0.0;
memset(ci, 0, sizeof(ci));
for (int j = 1; j <= nN; ++j)
{
scanf("%lf", &c);
ci[j] = ci[j - 1] + c;//ci[j]代表數列ci中第1-j項的和
sum += ci[j];
}
a1 = (nN * a0 + an1 - 2 * sum) / (nN + 1);
printf("%.2f", a1);
putchar('\n');
if (nCases)
{
putchar('\n');
}
}
return 0;
}