abc236 F - Spices

题意:

\(S=\{1,2,\dots , 2^n-1\}\) 的一个子集 \(E\),要求 \(E\) 的子集的异或和取遍 \(S\) 的所有元素。选取 \(S_i\) 要花费 \(c_i\),问最小花费

\(2\le n \le 16\)

思路:

从小到大考虑每个数,若当前数不能被前面选的数异或表出则选它。暴力判断即可

最终选出 \(n\) 个数构成一组基

int n; pair<int, int> a[1<<16];
bool v[1<<16];
void sol() {
    cin >> n;
    for(int i = 1; i <= (1<<n)-1; i++)
        cin >> a[i].first, a[i].second = i;
    sort(a + 1, a + (1<<n));
    v[0] = true;
    ll ans = 0;
    for(int i = 1, k = 1; k <= n; i++) if(!v[a[i].second]) {
        k++;
        ans += a[i].first;
        for(int j = 0; j < (1<<n); j++)
            if(v[j]) v[j ^ a[i].second] = true;
    }
    cout << ans;
}
posted @ 2023-01-19 17:26  Bellala  阅读(39)  评论(0)    收藏  举报