2022summer-rating3D 购物2

链接:https://ac.nowcoder.com/acm/contest/38650/D
来源:牛客网

题目描述

依晴听说最近某平台在进行暑期特促,于是决定进行一波购物。她来到商店,发现一共有 \(2^n-1\)件商品,其中第 \(i\) 件商品的价值为i,价格为 \(c_i\)

她摸了摸兜里的钱,发现没带太多,于是打消了“一网打尽”的幻梦,但是作为一名完美主义者,她决定她购买的商品需要满足以下条件:

每种商品最多购买一次
对于购买的商品,使得能够通过异或运算,使它们的价值组合出 $1\sim 2^n-1 $ 中的任意数。
依晴自然想要省钱啦,于是她想知道最少需要花多少钱才能满足她的条件。

思路:

贪心地先选择价格便宜的商品。先将商品按照价格排序,然后遍历数组,维护已选的商品价值所能组合出的值,如果当前的价值不能被组合出来,则选择这件商品,更新,否则跳过。
维护时用两个集合维护

代码

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n, m;
struct node {
	int num, id;
} a[100005];
set<int> s1, s2;
bool compare(node x, node y) {
	return x.num < y.num;
}
int main () {
	ll ans = 0;
	cin >> m;
	n = (1 << m) - 1;
	for (int i = 1; i <= n; i++) cin >> a[i].num, a[i].id = i;
	sort(a + 1, a + n + 1, compare);
	for (int i = 1; i <= n; i++) {
		if (s1.count(a[i].id)) continue;
		else {
			ans += a[i].num;
			s2.insert(a[i].id);
			for (auto x : s1) s2.insert(a[i].id xor x);
			for (auto x : s2) s1.insert(x);
		}
	}
	cout << ans << endl;
return 0;
}
posted @ 2022-08-09 17:48  misasteria  阅读(16)  评论(0编辑  收藏  举报