SRM 600 div 2 T 2

题意:给你50个数,问你最少去掉多少数能使得剩下的数不可能具备子集S,OR起来为goal

如果一个数不是goal的子状态,那么我们没必要删除他,所以我们只关心goal的子状态的数

1:如果所有的数OR起来都没有到达goal,那么就是0

2:每个数都会贡献一些位,去掉1的个数最少的那一位就好了

#include <bits/stdc++.h>
using namespace std;

class ORSolitaireDiv2
{
public:
int getMinimum(vector <int>, int);
};
int ORSolitaireDiv2::getMinimum(vector <int> numbers, int goal)
{
    int ans = 33, cnt = 0;
    bool f[33];
    memset(f,false,sizeof(f));
    for (int i = 0; i < 33; i ++)
        if (!(goal & (1 << i))){
            for (int j = 0; j < numbers.size(); j ++)
                if (numbers[j] & (1 << i))
                    f[j] = true;
        }
    for (int i = 0; i < 33; i ++)
        if (goal & (1 << i)){
            cnt = 0;
            for (int j = 0; j < numbers.size(); j ++)
                if ((numbers[j] & (1 << i)) && !f[j])
                    cnt ++;
            ans = min(ans, cnt);
        }
cnt = 0;
for(int i = 0;i < numbers.size(); i++)
if (f[i])
            cnt ++;
ans = min((int)numbers.size() - cnt, ans);
return ans;
}
原文地址:https://www.cnblogs.com/wjnclln/p/9558686.html