2022牛客OI赛前集训营-普及组(第一场) D

一开始觉得是while做,但是越写越假,就放弃了。

看了AC代码以后,就是while做,晕。


 

两只小青蛙 A 和 B 想从河的一端跳到另一端,它们分别选择了一条道路,每条道路上都有 n 个石子,A 在第一条道路上进行跳跃,B 在第二条道路上进行跳跃。双方不能跳到对方的道路上,青蛙只能跳到石子上,不能跳到河里。青蛙只能前进,不能后退,可以一次跳过多个石子,不必逐个石子向前跳。青蛙的跳跃距离至多为 m,但是他们有一个助跳器,可以让自己的跳跃距离上限变为 k(m<k)。

初始时跳跃器在青蛙 A 手中,它们虽然不在一个道路上,但是可以相互传递跳跃器。即 A 可以将跳跃器传给 B,B 也可以将跳跃器传给 A。但是如果他们距离之差超过 q,则无法传递。

请问两只青蛙都跳到终点(第 n 个石子)最少需要传递几次助跳器?

保证相邻石子的距离之差小于 k,可以证明两只青蛙一定可以都抵达终点。

输入描述:

第一行输入四个正整数 n,m,k,q

接下来一行包含 n 个正整数,分别表示第一只青蛙面前的 n 颗石头到起点的距离,第 i 个正整数为 ai(1≤ai≤10^6),保证对于任意的 i,有 ai<ai+1。

接下来一行包含 n 个正整数,分别表示第二只青蛙面前的 n 颗石头到起点的距离,第 i 个正整数为 bi(1≤bi≤10^6),保证对于任意的 i,有 bi<bi+1​。

输出描述:

输出一行一个整数表示答案。

示例1

输入

4 2 5 10
5 10 15 20
2 4 6 8

输出

0

说明

A 拿着助跳器直接跳到终点,而 B 面前的石子距离较近,可以直接跳,所以 B 可以不借助助跳器直接跳到终点。共传递 0 次助跳器。

示例2

输入

4 2 5 10
5 10 15 20
5 10 15 20

输出

2

说明

青蛙 A 先走到第二颗石头(位置 10),此时将助跳器传递给青蛙 B;青蛙 B 跳到终点(位置 20)再将助跳器传递给 A,A 跳到终点。

注意:若 A 直接跳到终点,则此时助跳器传递不到 B(因为两青蛙此时的距离大于 qqq),B 无法抵达终点。

示例3

输入

4 2 5 6
4 8 12 14
5 10 15 20

输出

3

说明

A 跳一次之后传给 B,B 跳两次到 10,此时两青蛙距离是 10-4=6,刚好可以传递,再由 B 传递给 A,让 A 一直跳到终点(14),A 再传递给 B 让 B 跳到终点。共传递 3 次。

示例4

输入

4 3 6 7
4 5 9 11 
5 11 16 19

输出

3

备注:

本题共有 10 个测试点

对于 1-2 的测试点,有 1≤n,m,k,q≤8

对于 3-4 测试点,有 an≤k

对于 5-7 测试点,有 1≤n,m≤80,m<k<q≤300

对于 100% 的数据,有 1≤n,m,k,q≤1000

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e3+10;
int a[N],b[N],n,m,k,p,la,lb,ans;
int i;
bool turn;
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin>>n>>m>>k>>p;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    for(int i=1; i<=n; i++)
    {
        cin>>b[i];
    }
    while (la<n && lb<n)
    {
        if (!turn)//跳跃器在A
        {
            while (lb<n && b[lb + 1]-b[lb]<=m)
                lb++;
            if (lb!=n)
            {
                for (i=1;i<=n;i++)
                    if (a[i]-b[lb]>p)
                        break;
                la=i-1;
                ans++;
                turn=true;
            }
        }
        else//跳跃器在B
        {
            while (la<n && a[la + 1]-a[la]<=m)
                la++;
            if (la!=n)
            {
                int i;
                for (i=1;i<=n;i++)
                    if (b[i]-a[la]>p)
                        break;
                lb=i-1;
                ans++;
                turn=false;
            }
        }
    }
    cout<<ans<<"\n";
    return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值