题目链接:
https://cn.vjudge.net/problem/POJ-1759
题目大意:
N个灯泡离地H_i,满足H1 = A ,Hi = (Hi-1 + Hi+1)/2 – 1,HN = B ,求最大B
解题思路:
如果二分B,会变成无从下手,发现如果求出H2,那么就可以之后的所有高度都固定了。
所以二分H2,如果循环下去求到某一个Hi小于0,说明这个H2较小,应该变大。
求出满足条件的最小的H2,这样就可以求出最低的B
因为H2大的话,B肯定会大
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> #define MID(l, r) (l + (r - l) / 2) #define lson(o) (o * 2) #define rson(o) (o * 2 + 1) using namespace std; typedef long long ll; const int INF = 1e9 +7; const int maxn = 1e6 + 10; const double eps = 1e-8; int main() { int n; double a; cin >> n >> a; double l = 0, r = 1e10; double h1, h2, h3, ans; for(int i = 0; i < 100; i++) { double mid = (l + r) / 2; h1 = a, h2 = mid; bool ok = 1; for(int j = 1; j <= n - 2; j++)//只需要循环n-2次即可,因为第一次循环求出H3,第n-2次循环求出Hn { h3 = 2 * h2 + 2 - h1; h1 = h2; h2 = h3; if(h3 < 0) { ok = 0; break; } } if(ok)ans = h3, r = mid; else l = mid; } printf("%.2f ", ans); return 0; }