/******
* 题意:给出n个数,和一个目标数goal,求最少去掉这n个数中的多少个数,可以使得任意选取剩下的数进行位运算 or 操作都不能得到目标数goal
* 方法:由于or操作只能将0变成1 ,而不能将1变成0,所以对于目标数的每一位,如果是0,那么这一位是1的数都不用删去。
* 我们这样来考虑,不能得到目标数goal的含义是 对于目标数的某一位为1,而我们不能通过or操作将当前位变为1,也就是所有数的当前位都不含1,这样我们就一定不能得到目标数goal,也就是说我们需要删去当前位为1的所有数来达到使这一位不能得到1的要求。我们在所有goal为1的位里取最小值。
*/
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
class ORSolitaire
{
public:
int getMinimum(vector <int> numbers, int goal)
{
int ans = numbers.size();
int len = ans;
for(int i = 0; i < 31; i++){
if( goal & (1<<i) ){
int c = 0;
for(int k = 0; k < len;k++){
int x = numbers[k];
if( (x & (1<<i)) && ( (goal &x) == x)){ // (goal & x) == x 表示goal中为0的位 ,x也一定为0
c++;
}
}
ans = min(ans , c);
}
}
return ans;
}
};
Topcoder SRM 600 ORSolitaire
最新推荐文章于 2018-08-25 18:35:00 发布