Dasha Code Championship - SPb Finals Round B. Marcin and Training Camp(思维+规律)

题目链接
在这里插入图片描述
在这里插入图片描述
题意:给定n个数,如果n个数里只有一个数的某个二进制是1,那么他就很高傲,否则就很平静,每个数有代价bi,问你要找到至少2个人平静在一起的最大代价。
思路:比较难想的就是怎么的人可以平静的坐一起,我们发现要想坐一起的话,这个集合肯定是有重复的,那么单单重复元素就可以了吗?其实还可以在重复的集合中加入这个数的子集(比如一个数的二进制是11000,那么1000就是11000的子集)。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=7e3+1;
map<ll,ll>p;
set<int>s;
ll a[maxn],b[maxn],ans;
int main()
{
	int n;
	scanf("%d",&n);
	for(int i=1;i<=n;++i) scanf("%lld",&a[i]),p[a[i]]++;
	for(int i=1;i<=n;++i) scanf("%lld",&b[i]);
	for(auto it:p)
	{
		if(it.second<=1) continue;
		for(int i=1;i<=n;++i)
		if((it.first&a[i])==a[i]) s.insert(i);
	}
	for(auto it:s) ans+=b[it];
	printf("%lld\n",ans);
}
发布了144 篇原创文章 · 获赞 0 · 访问量 4943

猜你喜欢

转载自blog.csdn.net/qq_42479630/article/details/104523872