C会赢的!(牛客周赛 Round 58)
题目链接:
C-会赢的!_牛客周赛 Round 58 (nowcoder.com)
题目描述:
输入和输出描述:
样例输入:
3
1 1
1 0
-1 -1
样例输出:
NO
YES
PING
题目分析:
题目要求只能向下和向右走,起点是(0, 0),因此先判断:x < 0 或者是y < 0就是平局了(大家都赢不了)。
在对应的区域里面的话,对一下情况进行讨论:
x == y
这种情况是(1, 1) 、(2, 2)、(3, 3)这一定是后手赢的。一共走的步数是2 * x或表示为2 * y(x和y相等),一定是个偶数,先手知道自己会输,那么他下的时候就想偏离航线,想平局,但是不行,后手知道自己要想赢的话,就要控制先手的航线,so后手会反着来。先手向右走,后手就会向下走,先手向下走,后手就会向右走。走着走着,后手就到达了目标区域了。
abs(x - y) == 1:
这个时候就是先手赢了,(a + a - 1)一定是个奇数,先手赢。这个和(x == y)这种情况是类似的,后手知道自己会输,但是先手会和后手反着来,你向右,我就向下,你向下,我就向右,尽力控制航道。大家走着走着就到达了终点了。
其他:
难办,大家都别办了。知道自己输的那个就会使劲偏离轨道,就不让你赢,大家都别赢了。
比如:终点是(1, 4),从(0, 0)到(1, 4)需要走1 + 4步,要是大家规规矩矩的话,是先手赢,但是后手不想让先手赢。后手就会极端的让x变大,也就是一直向x轴方向走,让x超过1,这样先手就回不去了。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while(t -- ) {
int x, y;
cin >> x >> y;
if(x < 0 || y < 0 ) {
cout << "PING" << endl;
} else {
int h = y;
int l = x;
if(h + l == 1 ) {
cout << "YES" << endl;
} else if(h == l) {// 反着来
cout << "NO" << endl;
} else {
if(h - l == 1 || l - h == 1) {
cout << "YES" << endl;
}else {
cout << "PING" << endl;
}
}
}
}
return 0;
}