AcWing 730. 机器人跳跃问题
原题链接
中等
作者:
满目星河_0
,
2021-03-31 12:35:44
,
所有人可见
,
阅读 211
带注释(超详细)
//算法思想:第一步:找到区间为0-100000,答案在这个区间内。
//第二步:利用二分法找到分界点,这个题目的分界点在于能量能否够用,用check函数检查是否够用。
//这个题目并不涉及左端点和右端点的问题,所以用任何一个左端点和右端点的模板带入都可以。
//输出最终答案。
//注意: 利用题目中的数学关系,若e>Hmax时,后面就不用判断了,当前的e肯定能满足。如果继续判断会报错,因为2e可能
//会超过int的数据范围(2的32次方),所以会报错。
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int N=100010;
int n;
int q[N];
bool check(int e){//检查能量是否够用。
for(int i=0;i<n;i++){
e=2*e-q[i];
if(e<0) return false;
if(e>100000) return true;//如果没有这句话会报错。
}
return true;
}
int main(){
cin>>n;
for(int i=0;i<n;i++) scanf("%d",&q[i]);
int l=0,r=100000;//第一步
while(l<r){ //利用二分法找到分界点。
int mid=(l+r)/2;
//cout<<mid<<endl;
if(check(mid)) r=mid;
else l=mid+1;
}
cout<<l;
return 0;
}