1. 程式人生 > >POJ-1759 Garland---二分+數學

POJ-1759 Garland---二分+數學

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; 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\n", ans); return 0; }

POJ-1759 Garland---二分+數學