题目大意:给出n个灯,以及第1个灯的高度。第i个灯的离地高度,为h[i] = (h[i-1]+h[i+1])/2 - 1。求最后一个灯的高度最小值。
分析:由于已知第1个灯的高度,所以,只需要知道第2个灯高度,便能推出其他的灯。因此,二分第2个灯的高度。
代码:
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define eps 1e-8
const int maxn = 1111;
int n;
double a, b, h[maxn];
bool C(double mid) {
h[1] = mid;
for(int i = 2; i < n; i++) {
h[i] = (h[i-1]+1)*2-h[i-2];
if(h[i] < eps) return false;
}
b = h[n-1];
return true;
}
int main() {
while(~scanf("%d%lf", &n, &a)) {
h[0] = a;
double L = 0.0, R = 1001.0;
while(R-L > eps) {
double mid = (L+R)/2;
if(C(mid)) R = mid;
else L = mid;
}
printf("%.2f\n", b);
}
return 0;
}