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

浙公网安备 33010602011771号