篮桥训练(第一场)

青蛙过河 - 蓝桥云课 (lanqiao.cn)

题意:现在一只青蛙过河,河里有石头,石头每踩一下就会下沉一厘米,然后给你河宽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;
}

 

posted @ 2023-10-25 17:17  whatdo+  阅读(9)  评论(0编辑  收藏  举报