https://vjudge.net/problem/CodeForces-1230Dios
要組建一個小組,要求小組中每一個人都不比全部人強,當一我的懂得一個算法可是另外一個不懂那麼前者認爲他比後者強。因此這個小組要知足一我的懂得算法一定有另外一我的全懂。每一個人的技能是不一樣的,要求出這個小組能組成的技能最大值。c++
先遍歷一遍,用map記錄a[i](會的算法)的個數,出現次數大於等於2的a[i],是確定能夠放到小組裏的,由於有人和他的懂的相同。算法
而後對出現次數小於2的人,和剛纔肯定的人的對比,若是他的能力大於肯定的人,那麼確定不行,由於他會的有的東西其餘人都不會;若是他的能力小於肯定的人,並且(x&y)==x,x是他,y是肯定的人,這個式子就表示了x會的算法肯定的人裏也會,因此能夠加入到小組裏。spa
#include<bits/stdc++.h> using namespace std; #define inf 0x3f3f3f3f #define ll long long const int N=200005; const int mod=1e9+7; const double eps=1e-8; const double PI = acos(-1.0); #define lowbit(x) (x&(-x)) int n; ll a[N],b[N]; vector<ll> ans; map<ll,ll> mp; int main() { std::ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) { cin>>a[i]; mp[a[i]]++; } ll res=0; for(int i=1;i<=n;i++) { cin>>b[i]; if(mp[a[i]]>=2) ans.push_back(i),res+=b[i]; } for(int i=1;i<=n;i++) { if(mp[a[i]]<2) { for(int j:ans) { if(a[i]<a[j]&&((a[i]&a[j])==a[i])) { res+=b[i]; ans.push_back(i); break; } } } } cout<<res<<endl; return 0; }