题目大意:给出n和a,求出满足题目给定的四个条件的序列,要求h[n] = b最小。
解题思路:根据h[i] = (h[i-1]+h[i+1])/2 - 1可以的出h[i+1] = 2h[i] + 2 - h[i-1], 然后可以得出h[n] = k * h[2] - b,只要维护h[2]保证h均大于等于0且最小即可。
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1005;
int n;
double a, k[N], b[N];
double solve() {
double ans = 0;
k[1] = 0; b[1] = a;
k[2] = 1; b[2] = 0;
for (int i = 3; i <= n; i++) {
k[i] = 2 * k[i-1] - k[i-2];
b[i] = 2 * b[i-1] - b[i-2] + 2;
if (ans * k[i] + b[i] < 0) ans = -b[i]/k[i];
}
return k[n] * ans + b[n];
}
int main() {
while (scanf("%d%lf", &n, &a) == 2) {
printf("%.2lf\n", solve());
}
return 0;
}