hdoj-2086-A1=?

题目:A1=?

代码(作者:Fistice):

#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<stack>
#include<cstdlib>
#include<vector>
#include<algorithm>
using namespace std;
#define INF 99999999
double c[3005]={0},a0,an1;
int n;
int main()
{
    int i,j;
    while(~scanf("%d",&n))
    {
        scanf("%lf%lf",&a0,&an1);
        for(i=1;i<=n;i++)
        scanf("%lf",&c[i]);
        
        double sum=0;
        sum+=n*a0+an1;
        
        for(i=1;i<=n;i++)
        {
            sum-=(n-i+1)*c[i]*2;
        }
        sum/=n+1;
        printf("%.2lf\n",sum);
    }
}

下面是网上的解析,很清楚。

因为:Ai=(Ai-1+Ai+1)/2 - Ci,  
      A1=(A0  +  A2)/2 - C1;  //(1)式
      A2=(A1  +  A3)/2 - C2 , ... 
=>    A1+A2 = (A0+A2+A1+A3)/2 - (C1+C2) 
=>    A1+A2 =  A0+A3 - 2(C1+C2)  
同理可得: 
      A1+A1 =  A0+A2 - 2(C1)  //注:A1+A1=2A1=(A0 + A2)-2*C1 由(1)式得。
      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) 

Posted by Fistice at 2016-02-19 15:09:37 on Problem 2086

做后小结:
只能说这道题的推导过程自己能够理解,但是没有一定的思维逻辑和数学基础很难ac这题。
刚刚开始用函数递归来求解。但是对于数学题,递归往往效率相对数学算法低且容易T。
很有趣也很需要思考的一道题,记之。

posted @ 2016-03-14 18:51  Wasdns  阅读(310)  评论(0编辑  收藏  举报