Codeforces Round 834 (Div. 3) C题 Thermostat

思路讲解:

这道题真的有点抽象了,我只能说,首先我们要合理的推断出它其实是只有0,-1,1,2,3这几种情况的,然后我们思考如何来对应哪种情况
首先a点和b点位置相同的情况,这时不需要进行跳跃,移动,直接结果就是0
然后讨论a不可能到达b的情况,这时有两种可能,要不a点不能跳,从a到达不了任何的点,要不就是可以跳但是到达不了b点,跳最远肯定是从l或是r开始跳,要是b点距离l和r都太近了,那么是不行的,这两种情况都是-1,不可到达
然后说一下1,2,3这三种情况,1好说,就是一步就可以到达,那么就是a和b距离足够远,a和b之间的距离大于x,2的话,说明一步达到不了,那么就是a和b太近了,那么先从a跳到l,再从l跳回b
即从a跳到一个端点,然后再从此端点回跳回来就好了,这是2步,剩余情况就是三步
 

代码实现:

#include<bits/stdc++.h>

using namespace std;

void solve()
{
    int l,r,x;
    cin>>l>>r>>x;

    int a,b;
    cin>>a>>b;

    if(a==b)
    {
        cout<<"0"<<endl;
        return;
    }

    if((abs(a-l)<x && abs(a-r)<x) || (abs(b-l)<x && abs(b-r)<x))
    {
        cout<<"-1"<<endl;
        return;
    }
    else
    {
        if(abs(a-b)>=x)
        {
            cout<<"1"<<endl;
            return;
        }
        else if((abs(a-r)>=x && abs(b-r)>=x) || (abs(a-l)>=x && abs(b-l)>=x))
        {
            cout<<"2"<<endl;
            return;
        }
        else
        {
            cout<<"3"<<endl;
            return;
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin>>t;

    while(t--)
    {
        solve();
    }

    return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值