ACM-公式--HDOJ 2086--A 1=?


HDOJタイトルアドレス:転送ゲート
A1 = ?
Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6965    Accepted Submission(s): 4330
Problem Description
次の方程式があります:A
i = (A
i-1 + A
i+1)/2 - C
i (i = 1, 2, 3, .... n).
Aが与えられたら
0, A
n+1とC
1, C
2, .....C
n.
プログラミング計算A
1 = ?
 
Input
入力には、複数のテストインスタンスが含まれます.
各例について、まず正の整数n、(n<=3000)である.そして2つの数a
0, a
n+1.次のn行は行ごとに1つの数cがある
i(i = 1, ....n);入力はファイルの終端で終わります.
 
Output
各試験例について、求めるa 1を1行出力(小数2桁保持).
 
Sample Input

   
   
   
   
1 50.00 25.00 10.00 2 50.00 25.00 10.00 20.00

 
Sample Output

   
   
   
   
27.50 15.00

なぜなら:Ai=(Ai-1+Ai+1)/2 - Ci,  
      A1=(A0  +A2  )/2 - C1; 
      A2=(A1  +  A3)/2 - C2 , ... 
=>    A1+A2 = (A0+A2+A1+A3)/2 - (C1+C2) 
      2[(A1+A2)+(C1+C2)] = A0+A2+A1+A3; 
      A1+A2 = A0+A3 - 2(C1+C2); 
=>    A1+A2 =  A0+A3 - 2(C1+C2)  
同じ理屈で得られる: 
      A1+A1 =  A0+A2 - 2(C1)  
      A1+A2 =  A0+A3 - 2(C1+C2) 
      A1+A3 =  A0+A4 - 2(C1+C2+C3) 
      A1+A4 =  A0+A5 - 2(C1+C2+C3+C4) 
      ... 
      A1+An = A0+An+1 - 2(C1+C2+...+Cn) 
----------------------------------------------------- 左右の和を求める. 
     (n+1)A1+(A2+A3+...+An) = nA0 +(A2+A3+...+An) + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn) 
  
=>   (n+1)A1 = nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn) 
  
=>   A1 = [nA0 + An+1 - 2(nC1+(n-1)C2+...+2Cn-1+Cn)]/(n+1)
#include <iostream>
#include <cstdio>
using namespace std;
int main (){
      int i,j,n;
      double sum;
      while (scanf("%d",&n)!=EOF){
         sum=0;
         double a[3500],c[3500],d;
         scanf("%lf%lf",&a[0],&a[n+1]);
         for (i=1; i<=n; i++)
             scanf("%lf",&c[i]);
         a[1]=n*a[0]+a[n+1];
         for (i = n, j = 1; i >=1&&j <= n; j++,i--)
             sum += i*c[j];
         a[1] = (a[1] - 2*sum)/(n+1);
         printf ("%.2lf
",a[1]); } return 0; }