Koshary 的题解
记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。
在解题之前提交题解的代码会导致封禁。
作者:
概述
本题判断从原点 能否通过若干次长步(使某一坐标增加
)和至多一次短步(使某一坐标增加
)到达目标
。
核心解法是分析坐标奇偶性:长步不改变奇偶性,短步至多改变一个坐标的奇偶性,因此目标两个坐标不能都为奇数。
分析
核心观察
长步每次增加 ,不改变坐标的奇偶性;短步仅有一次,只改变一个坐标的奇偶性。所以最终两个坐标中至多只有一个为奇数。
思路
设目标坐标为 。如果
和
都是奇数,则必须至少两次短步(分别改变两个坐标的奇偶性)才能实现,但题目只允许至多一次短步,因此不可达。
反过来,如果 和
不全是奇数,则一定可达:
- 若两个都是偶数,只用长步即可(分别走
和
次长步)。
- 若
为奇数,
为偶数,则在
方向使用一次短步,其余
次长步,
方向用
次长步。
- 若
为偶数,
为奇数,同理在
方向使用一次短步。
由于,上述构造中的长步次数均为非负整数,满足要求。
具体示例
以样例 为例:
为奇数,
为偶数,条件成立,输出 YES。路径:短步横移
,长步纵移
。
样例 :两个都是奇数,不成立,输出 NO。
算法步骤
- 读入测试用例数
。
- 对于每个测试用例,读入
和
。
- 若
和
均为奇数,则输出
"NO";否则输出"YES"。
复杂度分析
- 时间复杂度:
。
- 空间复杂度:
。
实现注意事项
- 判断条件为
(x % 2 == 1 && y % 2 == 1)。 - 输出大小写不敏感,统一输出大写
"YES"或"NO"。 - 数据范围很小,整数类型使用
int足够。
源代码
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin >> t;
while (t--) {
int x, y;
cin >> x >> y;
if ((x & 1) && (y & 1)) {
cout << "NO\n";
} else {
cout << "YES\n";
}
}
return 0;
}
import sys
def main():
data = sys.stdin.read().strip().split()
if not data:
return
t = int(data[0])
out = []
idx = 1
for _ in range(t):
x = int(data[idx]); y = int(data[idx + 1])
idx += 2
if (x % 2 == 1) and (y % 2 == 1):
out.append("NO")
else:
out.append("YES")
sys.stdout.write("\n".join(out))
if __name__ == "__main__":
main()
评论