首页 > 代码库 > 新生赛 1011 世界的光棍节礼物

新生赛 1011 世界的光棍节礼物

题目:

     现在,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]=(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]?

思路:

      首先,常数项可以并在一起,ai − ci= (ai−1 + ai+1)/2 − bi , d = bi - ci把式子变形成:  ai = (ai−1 + ai+1)/2 − d

再次变形:ai+1 - ai - 2di = ai - ai-1        1

      然后,i = 1开始,到i = n,根据公式得到 n个式子

a2 - a1 - 2d1 = a1 - a0

a3 - a2 - 2d2 = a2 - a1

···

an+1 - an - 2dn = an - an-1

      把这n个式子累加,得到

 a0 - a1 + an+1 - an - 2 * $ \sum_{i=1}^{n}d_i$  = 0       (2)

      由式(1)可得

 an+1 - an - 2dn= an - an-1

代入(2)可得代入                      

a0 - a1 + an - an-1 - 2 * $ \sum_{i=1}^{n-1}d_i$ = 0   (3)

      重复,得到:

a0 - a1 + a2 - a1 - 2d1 = 0      (n+1)

      将式(2)加到式子(n+1),得:

a1 = (n * a0 + an+1 - 2 * n * d1 - 2 * (n-1) * d2 - ··· - 2 * dn) / (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=0.0; 8     scanf("%d", &T); 9     while(T--)10     {11         scanf("%d", &n);12         scanf("%lf%lf", &x, &y);13         for(i = 1; i <= n; i++)14         {15             scanf("%lf", &b[i]);16         }17         for(i = 1; i <= n; i++)18         {19             scanf("%lf", &c[i]);20             d[i] = b[i] - c[i];21         }22         for(i = 1; i <= n; i++)23         {24             sum += 2 * (n - i + 1) * d[i];25         }26         a1 = (n * x - sum + y) / ( n + 1);27         printf("%.2lf\n", a1);28     }29 30     return 0;31 }
AC Code

 

新生赛 1011 世界的光棍节礼物