POJ1759 Garland —— 二分

Posted h_z_cong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ1759 Garland —— 二分相关的知识,希望对你有一定的参考价值。

题目链接:http://poj.org/problem?id=1759

 

Garland
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 2477   Accepted: 1054

Description

技术分享The New Year garland consists of N lamps attached to a common wire that hangs down on the ends to which outermost lamps are affixed. The wire sags under the weight of lamp in a particular way: each lamp is hanging at the height that is 1 millimeter lower than the average height of the two adjacent lamps. 

The leftmost lamp in hanging at the height of A millimeters above the ground. You have to determine the lowest height B of the rightmost lamp so that no lamp in the garland lies on the ground though some of them may touch the ground. 

You shall neglect the lamp‘s size in this problem. By numbering the lamps with integers from 1 to N and denoting the ith lamp height in millimeters as Hi we derive the following equations: 

H1 = A 
Hi = (Hi-1 + Hi+1)/2 - 1, for all 1 < i < N 
HN = B 
Hi >= 0, for all 1 <= i <= N 

The sample garland with 8 lamps that is shown on the picture has A = 15 and B = 9.75. 

Input

The input file consists of a single line with two numbers N and A separated by a space. N (3 <= N <= 1000) is an integer representing the number of lamps in the garland, A (10 <= A <= 1000) is a real number representing the height of the leftmost lamp above the ground in millimeters.

Output

Write to the output file the single real number B accurate to two digits to the right of the decimal point representing the lowest possible height of the rightmost lamp.

Sample Input

692 532.81

Sample Output

446113.34

Source

 
 
 
 
题解:
错误思路:惯性思维,一上来就想二分答案,即B点。但问题是,知道了A、B点,怎么求出中间的点呢?首先递推是推不出来的,然后就尝试用递归,看能否“先前进再返回”地求出各点,结果还是不行。后来也大概得出结论,如果要求出各个点:1)要么能推导出关于A、B点的公式直接计算;2)要么是知道相邻两个点的值,然后一路递推。公式我是推导不出来的,所以就要尝试第二种方法。所以:
1.二分第二个点,然后一路递推,直到求出B。
2.根据:H[i] = 2*H[i-1] + 2 - H[i-2] 可知,前两个点的值越小, 第三个点的值也越小,最终B的值也越小。所以二分的第二个点与B点具有同增同减性。
 
 
 
代码如下:
技术分享
 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 #include <vector>
 6 #include <cmath>
 7 #include <queue>
 8 #include <stack>
 9 #include <map>
10 #include <string>
11 #include <set>
12 #define rep(i,a,n) for(int (i) = a; (i)<=(n); (i)++)
13 #define ms(a,b) memset((a),(b),sizeof((a)))
14 using namespace std;
15 typedef long long LL;
16 const double EPS = 1e-8;
17 const int INF = 2e9;
18 const LL LNF = 9e18;
19 const int mod = 1e9+7;
20 const int maxn = 1e5+10;
21 
22 int n;
23 double A, ans;
24 
25 bool test(double x1, double x2)
26 {
27     for(int i = 3; i<=n; i++)   //递推出每个点的高度
28     {
29         double x3 = 2*x2+2-x1;
30         if(x3<=0) return false; //出现负数,证明接地了, 不符合。
31         x1 = x2, x2 = x3;
32     }
33     ans = x2;   //符合条件, 则更新答案。
34     return true;
35 }
36 
37 int main()
38 {
39     while(scanf("%d%lf", &n, &A)!=EOF)
40     {
41         double l = 0, r = A;    //二分第二个点
42         while(l+EPS<=r)
43         {
44             double mid = (l+r)/2;
45             if(test(A, mid))
46                 r = mid - EPS;
47             else
48                 l = mid + EPS;
49         }
50         printf("%.2f\n", ans);
51     }
52 }
View Code

 












以上是关于POJ1759 Garland —— 二分的主要内容,如果未能解决你的问题,请参考以下文章

POJ-1759 Garland---二分+数学

POJ 1759 Garland(二分答案)

poj 1759 Garland

POJ 1064 1759 3484 3061 (二分搜索)

POJ 1064 1759 3484 3061 (二分搜索)

poj 1759 二分搜索