1 条题解

  • 0
    @ 2026-3-12 9:40:35

    文字教学

    用DFS(深度优先搜索)枚举所有选人的可能性,对每个人做“选”或“不选”的决策:

    1. 递归参数idx 表示当前处理到第 idx 个人,val 表示当前已选人的能力异或值。
    2. 边界条件:当 idx == n 时,用 val 更新最大得分 ans,然后返回。
    3. 递归过程
      • 不选第 idx 个人:直接递归到 idx+1val 不变;
      • 选第 idx 个人:递归到 idx+1val 异或上第 idx 个人的能力值。
    4. 因为 n21n \le 21,总共有 2212002^{21} \approx 200 万种状态,DFS完全可以通过。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef unsigned long long ull;
    ull a[25], ans;
    int n, k;
    
    void dfs(int idx, ull val) {
        if (idx == n) {
            if (val > ans) ans = val;
            return;
        }
        dfs(idx + 1, val);           // 不选第idx个人
        dfs(idx + 1, val ^ a[idx]);  // 选第idx个人
    }
    
    int main() {
        cin >> n >> k;
        for (int i = 0; i < n; ++i) {
            int c;
            cin >> c;
            a[i] = 0;
            for (int j = 0; j < c; ++j) {
                int x;
                cin >> x;
                a[i] |= 1ULL << (k - x);
            }
        }
        ans = 0;
        dfs(0, 0);
        cout << ans << endl;
        return 0;
    }
    
    • 1

    信息

    ID
    7314
    时间
    1000ms
    内存
    128MiB
    难度
    3
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者