首先我想说这道题真的很有意思,不过数据量稍微小了一些,所以我第一发水过去了,但是细想发现没这么简单,于是想了挺长时间写出了一发严谨的。
我觉得经过思考大家应该都对这道题有一些理解。我就直接讲我的想法了。第一发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;
}

京公网安备 11010502036488号