这道题是一道实数域进行二分的题目
比整数二分要好写,不用考虑边界死循环的问题
只要我们限定住我们的精确度就好了,(一个while循环搞定)
那么只要大力二分就好了
下面主要来说说check函数的部分
精髓就在check函数,即判断当前二分的答案是否合法的函数
依据题意,其实就是每次都让你的E在原来的基础上先乘2再减去你下一个要跳去的楼高(拿笔推一下就好)
每次做完这样一轮运算后,检查当前的E是否为负数
如果为负数直接return false
否则一直进行,直到进行n轮后还没退出,那么我们就返回true
最后用ceil函数向上取整并输出r即可
代码
#include<bits/stdc++.h>
using namespace std;
double h[200000];
int n;
bool check(double mid)
{
for(int i=1;i<=n;i++)
{
mid=mid*2-h[i];
if(mid<0)
{
return false;
}
}
return true;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf",&h[i]);
}
double l=0;
double r=1e8;
while(r-l>0.00001)
{
double mid=(r+l)/2;
if(check(mid))
{
r=mid;
}
else l=mid;
}
cout<<ceil(r)<<endl;
return 0;
}