Koshary 的题解


记住只在没有思路时使用题解,不要从它复制粘贴代码。请尊重题目和题解的作者。
在解题之前提交题解的代码会导致封禁。

作者: admin

概述

本题判断从原点 (0,0) 能否通过若干次长步(使某一坐标增加 2)和至多一次短步(使某一坐标增加 1)到达目标 (x,y)。
核心解法是分析坐标奇偶性:长步不改变奇偶性,短步至多改变一个坐标的奇偶性,因此目标两个坐标不能都为奇数。

分析
核心观察

长步每次增加 2,不改变坐标的奇偶性;短步仅有一次,只改变一个坐标的奇偶性。所以最终两个坐标中至多只有一个为奇数。

思路

设目标坐标为 (x,y)。如果 x 和 y 都是奇数,则必须至少两次短步(分别改变两个坐标的奇偶性)才能实现,但题目只允许至多一次短步,因此不可达。
反过来,如果 x 和 y 不全是奇数,则一定可达:

  • 若两个都是偶数,只用长步即可(分别走 x/2 和 y/2 次长步)。
  • 若 x 为奇数,y 为偶数,则在 x 方向使用一次短步,其余 (x-1)/2 次长步,y 方向用 y/2 次长步。
  • 若 x 为偶数,y 为奇数,同理在 y 方向使用一次短步。
    由于 x,y \ge 1,上述构造中的长步次数均为非负整数,满足要求。
具体示例

以样例 (1,2) 为例:1 为奇数,2 为偶数,条件成立,输出 YES。路径:短步横移 1,长步纵移 2。
样例 (5,9):两个都是奇数,不成立,输出 NO。

算法步骤
  1. 读入测试用例数 t。
  2. 对于每个测试用例,读入 x 和 y。
  3. 若 x 和 y 均为奇数,则输出 "NO";否则输出 "YES"。
复杂度分析
  • 时间复杂度:O(t)。
  • 空间复杂度:O(1)。
实现注意事项
  • 判断条件为 (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()

评论

目前没有评论。