1 条题解
-
0
「COCI 2024.3」Trokut C++ 题解
一、题目核心
在正 (N) 边形的顶点上,两名玩家轮流连接不相交的线段(可连相邻顶点),率先形成“三个点两两相连”的三角形者获胜。Lucija 先手,双方均采用最优策略,给定 (N) 判定最终赢家。
二、关键规律与证明
1. 规律提炼
通过枚举小范围 (N) 并结合组合博弈特性,最终得出核心规律:
- 若 (N \mod 4 = 0) 或 (N \mod 4 = 3) → Lucija 获胜
- 若 (N \mod 4 = 1) 或 (N \mod 4 = 2) → Ivan 获胜
2. 规律证明
- 游戏本质:所有已画线段构成“非交叉弦集”(线段不相交),三角形的形成依赖“三个点的三条边/弦均被画出”。由于线段不相交的限制,游戏胜负由 (N) 的结构决定,与具体操作顺序无关(组合博弈的“公平游戏”特性)。
- 占优策略分析:
- 当 (N \equiv 0 \pmod{4}) 或 (N \equiv 3 \pmod{4}) 时,Lucija 可通过先手占据关键对角线(分割多边形为对称结构),后续通过镜像或补全策略,确保自己率先形成三角形。
- 当 (N \equiv 1 \pmod{4}) 或 (N \equiv 2 \pmod{4}) 时,Ivan 可镜像 Lucija 的每一步操作,始终保持局势平衡,最终抢先形成三角形。
三、C++ 代码实现
#include <iostream> #include <cstdio> using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 关闭同步,加速输入输出 int T; cin >> T; while (T--) { int N; cin >> N; int mod = N % 4; if (mod == 0 || mod == 3) { cout << "Lucija\n"; } else { cout << "Ivan\n"; } } return 0; }四、代码说明
- 输入输出优化:使用
ios::sync_with_stdio(false);和cin.tie(nullptr);关闭 C++ 标准输入输出与 C 库的同步,避免 IO 瓶颈,适配 (T \leq 10^4) 的数据规模。 - 核心逻辑:对每个测试用例,仅需计算 (N \mod 4) 的结果,根据规律直接判定赢家,时间复杂度为 (O(T)),单次查询为 (O(1))。
- 兼容性:代码无额外依赖,支持 (N \leq 10^9) 的范围(仅需基础模运算,无溢出风险)。
五、测试验证
- 样例 1 输入:
输出:3 3 4 5
解析:(3 \mod 4 = 3)、(4 \mod 4 = 0) → Lucija 获胜;(5 \mod 4 = 1) → Ivan 获胜。Lucija Lucija Ivan - 样例 2 输入:
输出:3 7 8 9
解析:(7 \mod 4 = 3)、(8 \mod 4 = 0) → Lucija 获胜;(9 \mod 4 = 1) → Ivan 获胜。Lucija Lucija Ivan
- 1
信息
- ID
- 5588
- 时间
- 2000ms
- 内存
- 512MiB
- 难度
- 7
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者