这是一道二分的题目,关键在于我们应该如何check;这是采自acwing的题解证明
这是check的证明
#include<iostream> #include<cstring> #include<algorithm> using namespace std ; const int N = 1e5 +10 ; int n , x ; int a[N] ; int b[N] ; bool check(int mid){ bool flag = 1 ; for(int i = 0 ,j = mid; j < n ; j ++,i ++){ //遍历每一个区间 int sum = a[j] - a[i]; if(sum >= 2*x) continue ; // else flag = 0 ;//如果有任何一个区间内的高度小于2*x 那这个跳跃距离就小了,要变大 } return flag ; } int main(){ cin >> n >> x ; for(int i = 1 ; i < n ; i ++){ cin >> a[i] ; a[i] += a[i-1] ;//这里我们借助前缀和来优化一下 } int l = 0 , r = N ; while(l<r){//二分 int mid = (l+r) >> 1 ; if(check(mid)) r = mid ; else l = mid+1 ; } cout << l << endl ; return 0 ; }