题意:花环: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;
}