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;
}