题解 | 至

https://www.nowcoder.com/practice/36892cfda60144bb9eb8b20f2f61e0b6

首先我想说这道题真的很有意思,不过数据量稍微小了一些,所以我第一发水过去了,但是细想发现没这么简单,于是想了挺长时间写出了一发严谨的。

我觉得经过思考大家应该都对这道题有一些理解。我就直接讲我的想法了。第一发ac我是思考了一会觉得只要距离相等,或者处于对角线(距离差2),就ok=true。然后ac了

#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n;
    cin >> n;
    int x1, y1;
    cin >> x1 >> y1;
    int x2, y2;
    cin >> x2 >> y2;
    bool ok = false;
    if (x1 - x2 == y2 - y1)
        ok = true;
    if (x1 - x2 == y1 - y2 && (y1 < n - 1 && y2 < n - 1))
        ok = true;
    if (ok)
        cout << "YES\n";
    else
        cout << "NO\n";
}
int main()
{
    solve();
    return 0;
}

。但是我又思考了一下,原来我是运出来的,因为按理说,如果 Bing 和 Bong 的距离差是 4,6,8...偶数步, 只要空间足够,我们可以在第二行放障碍物(隔开或者连着放),让领先那个人绕很多次弯路,也是可以追平的

于是我开始脑海模拟分析领先者在第一行或者第二行的情况,如果领先者在第一行,如果想让ta减缓脚步,那么只能在第一行放置障碍物让他去到第二行,再在第二行放置障碍物,让ta步数加2,依次类推,步数增加偶数步。但我们经过模拟可以发现,此时落后者无论在第一或者第二行,ta都会被那些障碍物所影响,最终变成一种“双方间距依旧保持不变”的状态,所以我们可以得出第一个特判,领先者必须在第二行。

哦这是第二个特判,第一个特判应该是双方距离只能是偶数。然后根据第二个特判可以联想到,既然障碍物的影响,领先者在第二行那么落后者就不能也在第二行,这就是第三个特判。最后判断一下领先者的y小于n-1就行了,因为必须离终点大于等于2我们才能放置障碍物在中间呀。

#include <bits/stdc++.h>
using namespace std;
void solve()
{
    int n;
    cin >> n;
    int x1, y1;
    cin >> x1 >> y1;
    int x2, y2;
    cin >> x2 >> y2;
    int dista = (n - y1) + (2 - x1);
    int distb = (n - y2) + (2 - x2);
    bool ok = false;
    if (dista == distb)
    {
        ok = true;
    }
    else if (abs(dista - distb) % 2 == 0)
    {
        if (dista < distb)
        {
            if (x1 == 2 && x2 == 1 && y1 < n - 1)
                ok = true;
        }
        else
        {
            if (x2 == 2 && x1 == 1 && y2 < n - 1)
                ok = true;
        }
    }
    if (ok)
        cout << "YES\n";
    else
        cout << "NO\n";
}

int main()
{
    solve();
    return 0;
}

全部评论
666666666大神啊
2 回复 分享
发布于 2025-12-20 22:43 湖北
我错了大家,领先者和落后者的diff差值只能为2,在第二份代码原基础加个特判为2。比2大的偶数根本不行
点赞 回复 分享
发布于 2025-12-21 15:21 天津

相关推荐

ros275229:社团删了吧,cf因该1200才勉强入门吧,也删了,你可以写算法刷了多少道,都比这个好
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务