Codeforces 1230D - Marcin and Training Camp (贪心)
思路
显然,如果一个团队所有人里面会的算法都不完全一样,那么肯定存在一个看不起所有人的人(会得最多或会得最偏)。因此一个团队至少有两个人会的算法一模一样(即a值一样)。同时,如果有一个人在一个团队,那么会的题和他相当或比他少(是他的子集)的人也可以加入这个团队。
当然,团队人越多越好,这样b值和就越大。把所有会的算法完全一样的人提出来,再把是这群人的子集的人全部加入到一个团体。这就是答案团体。
#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
typedef long long ll;
const int N = 1e5 + 10;
pair<ll, ll> num[N];
set<ll> check;
int vis[N];
int main() {
int n;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> num[i].first;
}
for(int i = 1; i <= n; i++) {
cin >> num[i].second;
}
sort(num + 1, num + 1 + n);
for(int i = 2; i <= n; i++) {
if(num[i].first == num[i - 1].first) {
vis[i] = vis[i - 1] = 1;
check.insert(num[i].first);
}
}
for(ll val : check) {
for(int i = 1; i <= n; i++) {
if(vis[i]) continue;
if((val & num[i].first) == num[i].first) {
vis[i] = 1;
}
}
}
ll ans = 0;
for(int i = 1; i <= n; i++)
if(vis[i]) ans += num[i].second;
cout << ans << endl;
}