Garland POJ - 1759(二分)

传送门

题意:花环:N个灯泡离地H_i,满足H1 = A ,Hi = (Hi-1 + Hi+1)/2 – 1,HN = B ,求最小B。

题解:关键是选取什么值作为mid,已知A,如果知道第二个高度h2的话,就可以推出h3,然后又可以利用h2和h3推出h4。所以h2才是关键,设mid为h2,二分条件为mid可以使得所有灯泡高度大于零。

从严密性的角度讲,h2的大小是跟B正相关的,满足二分单调性的要求。

附上代码:


#include<iostream>
#include<cstdio>

using namespace std;

const int MAX_A=1e3+50;
const int MAX_N=1e3+50;

int N;
double A,B,H[MAX_N];

bool C(double mid)
{
    H[1]=mid;
    for(int i=2;i<N;i++){
        H[i]=2*H[i-1]+2-H[i-2];
        if(H[i]<0){
            return false;
        }
    }
    B=H[N-1];
    return true;
}

int main()
{
    scanf("%d%lf",&N,&A);
    H[0]=A;
    double lb=-1,ub=MAX_A+16;
    for(int i=0;i<100;i++){
        double mid=(ub+lb)/2;
        if(C(mid)){
            ub=mid;
        }else{
            lb=mid;
        }
    }
    printf("%.2f\n",B);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/zhouzi2018/article/details/83119037
今日推荐