Codeforces 1230D - Marcin and Training Camp (贪心)

Description

思路

显然,如果一个团队所有人里面会的算法都不完全一样,那么肯定存在一个看不起所有人的人(会得最多或会得最偏)。因此一个团队至少有两个人会的算法一模一样(即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;
}
posted @ 2020-04-14 23:16  limil  阅读(96)  评论(0编辑  收藏  举报