题目链接: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;
}