今天比赛又没出一题,时间全耗在这题上了。不过也不委屈,确实有很多我没想到的地方。
这个题要用二分法搜索答案。
利用 Hi = (Hi−1 + Hi+1)/2 − 1,显然已经知道h1,再知道h2就可以计算出全部的h。
h2怎么得到呢。
我当时没想到,可以用二分法猜数字。
或者说每个h2,在使得所有h都合法(大于等于0)的情况下,都会对应一个hn,也就是B。
h2与hn什么关系呢。这个可以推导关系式,它们成正比。h2越小hn越小。也可以分析下。
这就需要得到最小的使所有h都合法的h2。
这时候就要用二分法求下界了。二分区间是0到A。
这里要注意下二分的中止条件,浮点数的精度问题,如果直接写x<y可能会出现死循环。
二分法比较重要,经常用来查找和求上下界,或者是猜数字,我还是需要更加深刻的理解啊。
#include <cmath>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#define eps 1e-7
using namespace std;
int N;
double A,h[1010]={0};
bool Judge(double val)
{
h[1]=A;h[2]=val;
for(int i=3;i<=N;++i)
{
h[i]=2*h[i-1]-h[i-2]+2;
if(h[i]<0)
return false;
}
return true;
}
void BSsearch()
{
double x=0,y=A,mid;
while(y-x>eps)
{
mid=(x+y)/2;
if(Judge(mid))
y=mid;
else x=mid;
}
}
int main()
{
scanf("%d%lf",&N,&A);
BSsearch();
printf("%.2lf\n",h[N]);
return 0;
}