杭电2086

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

#include<stdio.h>
#include<string.h>
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 <stdio.h>
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;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容