1 条题解
-
0
CF1989A Catch the Coin 题解
题意简述
平面网格上有 个硬币,第 个硬币初始坐标为 ,且都不在原点 。Monocarp 初始在 。
每一回合:
- Monocarp 可以向八方向(上下左右及四对角)移动一步;
- 如果移动后到达某个硬币所在坐标,则立即收集该硬币;
- 之后所有未收集的硬币向下移动一格( 减 1)。
问对于每个硬币,Monocarp 是否能收集到它。
关键观察
设 Monocarp 在第 步移动后收集到硬币()。在第 步移动前,硬币已经下落了 次,其坐标为 。Monocarp 移动后到达的位置必须恰好是这个坐标,才能收集。
因此,存在整数 使 Monocarp 能在 步内从 移动到 。
在八方向规则下, 步能到达的坐标 满足 (切比雪夫距离 )。
于是条件为:
即同时满足:
$$|x| \le t \qquad \text{和} \qquad |y - t + 1| \le t $$
化简条件
由 展开:
左半边:$-t \le y - t + 1 \ \Longrightarrow\ y + 1 \ge 0 \ \Longrightarrow\ y \ge -1$。
右半边:。由于 可以取任意大整数,只要 ,总可以取足够大的 满足 且 ,即存在可行步数。
结论:能够收集硬币 当且仅当 。
构造方案
若 ,可这样构造 :
- 先取 (至少需要这么多步来调整水平坐标)。
- 再取 (如果 则 )。
可以验证 成立。于是 Monocarp 能在 步内移动到硬币所在位置并收集。
代码实现
只需读入每个 ,判断 :
#include <bits/stdc++.h> using namespace std; int main() { int n, x, y; cin >> n; for (int i = 0; i < n; ++i) { cin >> x >> y; // 通过推导可知:能抓到当前硬币当且仅当 y >= -1 if (y >= -1) puts("YES"); else puts("NO"); } return 0; }
- 1
信息
- ID
- 6887
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者