URAL - 1066 Garland(二分)
比赛的时候明明知道是二分,却没有写出来。。。
用二分法的特征:单调
用三分法的特征:只有一个凸点
开始的时候我还想对最后一个节点二分,其实没这个必要,因为我有个同学对这道题目推了大半张纸,最后的推出来的式子还是跟第二个点相关,
下面说一个比较巧妙的方法,二分第二个点,(这是因为第二个点的高度和最后一个点的高度是正相关的,第二个点的高度如果跟第一个点相同,则第三,四个点的高度会依次增加,如果第二个点的高度小很多,中间某个节点就可能接触到地面,这个很容易想到),最后把所有点的高度全部求出。如果中间有某个点的高度小于0,则第二个点稍微升高一点,如果全部的点都不会接触地面,那么第二个点就稍微降低一点。一直到逼近某个最小值。
代码入下:
#include <cstdio> #define M 1010 #define eps 1e-6 double ans[M], A; int n; int check(double x) { ans[1] = A; ans[2] = x; for(int i = 3; i <= n; ++i) { ans[i] = 2*ans[i-1]-ans[i-2]+2; if(ans[i]<-eps) return 0; } return 1; } int main () { scanf("%d %lf",&n, &A); double l = 0.0, r = A, mid; while(r-l>eps) { mid = (r+l)/2; if(check(mid)) r = mid; else l = mid; } printf("%.2lf\n", ans[n]); return 0; }