POJ-1759 Garland---二分+數學
阿新 • • 發佈:2018-05-12
ostream https clas 應該 TP std strong get 一次
題目鏈接:
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; doublea; 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\n", ans); return 0; }
POJ-1759 Garland---二分+數學