#include <iostream> using namespace std; int n,a[100005],l,r,ans,ma; bool check(int m,int max){ for(int i:a){ if(m>=max)return true;//如果给的数据很大,那么后续能量增长将非常恐怖, if(m<i){ //一旦能量超过高度最大值,后面肯定通关了,可以提前返回了 m-=i-m; if(m<0)return false; } else m+=m-i; } return true; } int main() { cin>>n; for(int i=0;i<n;i++){ scanf("%d",&a[i]); ma=max(ma,a[i]); } r=ma;//确定答案范围 while(l<=r){ int m=(l+r)/2; if(check(m,ma)){ ans=m; r=m-1; } else l=m+1; } cout<<ans; }
第3题【算法讲解051【必备】二分答案法与相关题目】 https://www.bilibili.com/video/BV1Mh4y1P7qE/?share_source=copy_web&vd_source=5065fa61022691e8df35c771a30e6d29