杭电2086

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2086
一开始一看,觉得这道题是道很水的题,用简单的递归就可以解决,就写下了如下代码

#include
#include
double value(int t, double a[3500],double c[3500])
{
    if (t == 0) return a[0];
    a[t] = (value(t-1,a,c) + a[t + 1]) / 2 - c[t];
    return a[t];
}
int main()
{
    int t, i;
    double a[3500];
    double c[3500];
    while (scanf("%d", &t) != EOF)
    {
        getchar();
        memset(a, 0, sizeof(a));    
        scanf("%lf",&a[0]);
        scanf("%lf",&a[t + 1]);
        for (i = 1; i <= t; i++) scanf("%lf", &c[i]);
        value(t,a,c);
        printf("%.2lf\n",a[1]);
    }
    return 0;
}

但无论怎么提交,都不能AC,去讨论区里面看也有人疑惑为什么不用递归。可见这道题并不允许使用递归求解。
后来问了下组员,不能用递归他们怎么解决,他们说用高中所学的数学归纳法,于是自己在草稿纸计算了一下,写出了如下代码:

#include 
int main()
{
    int n, i;
    double a, b, c, sum;
    while (~scanf("%d", &n))
    {
        scanf("%lf%lf", &a, &b);
        sum = 0;
        for (i = 0; i < n; i++)
        {
            scanf("%lf", &c);
            sum += (n - i) * c;
        }
        printf("%.2lf\n", (n * a + b - 2 * sum) / (n + 1));
    }
    return 0;
}

你可能感兴趣的:(杭电2086)