1 条题解

  • 0
    @ 2025-11-25 16:17:25

    「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;
    }
    

    四、代码说明

    1. 输入输出优化:使用 ios::sync_with_stdio(false);cin.tie(nullptr); 关闭 C++ 标准输入输出与 C 库的同步,避免 IO 瓶颈,适配 (T \leq 10^4) 的数据规模。
    2. 核心逻辑:对每个测试用例,仅需计算 (N \mod 4) 的结果,根据规律直接判定赢家,时间复杂度为 (O(T)),单次查询为 (O(1))。
    3. 兼容性:代码无额外依赖,支持 (N \leq 10^9) 的范围(仅需基础模运算,无溢出风险)。

    五、测试验证

    • 样例 1 输入:
      3
      3
      4
      5
      
      输出:
      Lucija
      Lucija
      Ivan
      
      解析:(3 \mod 4 = 3)、(4 \mod 4 = 0) → Lucija 获胜;(5 \mod 4 = 1) → Ivan 获胜。
    • 样例 2 输入:
      3
      7
      8
      9
      
      输出:
      Lucija
      Lucija
      Ivan
      
      解析:(7 \mod 4 = 3)、(8 \mod 4 = 0) → Lucija 获胜;(9 \mod 4 = 1) → Ivan 获胜。
    • 1

    信息

    ID
    5588
    时间
    2000ms
    内存
    512MiB
    难度
    7
    标签
    递交数
    2
    已通过
    1
    上传者