题目链接
题意:给定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);
}