篮桥训练(第一场)
题意:现在一只青蛙过河,河里有石头,石头每踩一下就会下沉一厘米,然后给你河宽n,需要过河的次数,和里面石头的高度,0厘米就不能用了
然后现在让你给出一个最小的x,就是青蛙的跳跃能力,一次能跳多远,你可以跳1到x,让你给出一个最小的x
题解:一看题我们就可以直接想到二分x答案,然后在判断一下即可,
问题就是这个怎么判断x符不符合答案,能不能让青蛙跳完x次
首先我们想一下,每次跳x那么在一开始可以跳的范围就是1到x,然后就是2到x+1,然后就是3到x+2,以此类推
我们发现也就是每一个区间里就需要跳到过河的次数就行,我们用前缀和处理每一个区间,然后取一个最小值,然后这个最小值大于或者等于过河次数,那就行
#include <bits/stdc++.h> #pragma GCC optimize("Ofast") #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> #include <cmath> //#define double long double //#define int long long //#define endl '\n'; using namespace std; const int N=5e6+7,M=1e1; const int INF = 0x3f3f3f3f; const int mod=100003; typedef pair<int,int> PII; int a[N]; int s[N]; int n,x; bool check(int mid) { int mi=1e9; for(int i=1;i+mid<=n;i++) { mi=min(mi,s[i+mid-1]-s[i-1]); } if(mi>=x) return true; else return false; } void solve() { cin>>n>>x; x*=2; for(int i=1;i<n;i++) { cin>>a[i]; s[i]=s[i-1]+a[i]; } int l=1,r=n; while (l<r) { int mid=(l+r)/2; if(check(mid)) r=mid; else l=mid+1; } cout<<l<<endl; } signed main(){ // std::ios::sync_with_stdio(false); // std::cin.tie(nullptr); int T=1; // cin>>T; while(T--){ solve(); } return 0; }