HDOJ HDU 2086 A1 = ? ACM 2086 IN HDU

MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

题目地址:
          http://acm.hdu.edu.cn/showproblem.php?pid=2086
题目描述:
Problem Description
有如下方程:Ai 
=  (Ai - 1   +  Ai + 1 ) / 2   -  Ci (i  =   1 2 3 . n).
若给出A0, An
+ 1 , 和 C1, C2, ..Cn.
请编程计算A1 
=   ?
 

Input
输入包括多个测试实例。
对于每个实例,首先是一个正整数n,(n 
<=   3000 ); 然后是2个数a0, an + 1 .接下来的n行每行有一个数ci(i  =   1 .n);输入以文件结束符结束。
 

Output
对于每个测试实例,用一行输出所求得的a1(保留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 (i  =   1 2 3 . n). 用A5做示范,就能猜测出公式来。证明方法可以采用数学归纳法。这里证明从略。
A5 
=  (A4  +  A6)  /   2   -  C5
A4 
=  (A3  +  A5)  /   2   -  C4  =  A3  /   2   +  A4  /   4   +  A6  /   4   -  C5  /   2   -  C4
=> A4  =  2A3 / 3   +  A6 / 3   -  2C5 / 3   -  4C4 / 3

A3 
=  (A2  +  A4)  /   2   -  C3  =  A2  /   2   +  A3  /   3   +  A6  /   6   -  C5  /   3   -  2C4  /   3   -  C3
=> A3  =  3A2 / 4   +  A6 / 4   -  C5 / 2   -  C4  -  3C3 / 2

A2 
=  (A1  +  A3)  /   2   -  C2  =  A1  /   2   +  3A2  /   8   +  A6  /   8   -  C5  /   4   -  C4  /   2   -  3C3  /   4   -  C2
=> A2  =  4A1 / 5   +  A6 / 5   -  2C5 / 5   -  4C4 / 5   -  6C3 / 5   -  8C2 / 5

A1 
=  (A0  +  A2)  /   2   -  C1  =  A0  /   2   +  2A1  /   5   +  A6  /   10   -  C5  /   5   -  2C4  /   5   -  3C3  /   5   -  4C2  /   5   -  C1
=> A1  =  5A0 / 6   +  A6 / 6   -  C5 / 3   -  2C4 / 3   -  C3  -  4C2 / 3   -  5C1 / 3

算到这里,我想你已经总结出公式了:
A1 
=  (n  *  A0  +  An + 1   -   2   *  Cn  -   4   *  Cn - 1   -    -   2   *  i  *  Cn - i + 1   -   2   *  n  *  C1)  /  (n  +   1

代码如下 :
MiYu原创, 转帖请注明 : 转载自 ______________白白の屋

#include 
< stdio.h >
int  main ()
{
    
int  n, i;
    
double  a0, an1, a1;
    
double  c[ 3000 ];
    
while  ( scanf (  " %d " & n)  !=  EOF )
    {
        scanf ( 
" %lf%lf " & a0,  & an1 );
        
for  ( i  =   0 ; i  <  n; i ++  )
        {
             scanf(
" %lf " , c  +  i);
        }
        a1 
=  n  *  a0  +  an1;
        
for  ( i  =   1 ; i  <=  n; i ++  )
        {
              a1 
-=   2   *  i  *  c[n  -  i];
        }
        printf ( 
" %.2f\n " , a1  /  ( n  +   1  ) );
    }
    
return   0 ;
}

你可能感兴趣的:(HDOJ HDU 2086 A1 = ? ACM 2086 IN HDU)