51nod1315(位运算)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1315

题意:中文题诶~

思路:位或(|)运算是二进制位有一个为1就为1,否则为0.你们我们不难想到如果大于k的元素加入运算中其结果一定大于k, 与k异或结果大于k的元素加入运算中其结果一定不为k, 所以我们只要考虑剩下的元素就好了。剩下的也不难想到,对于当前二进制位,若k为1,那么我们可以把所有当前二进制位为1的元素去掉,其子集异或结果一定不为k;若k为0,那么我们可以把所有当前二进制位为0的元素去掉,其子集异或结果一定不为k. 我们只要取这些选择中最优的就是答案啦。。。

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 60
 3 using namespace std;
 4 
 5 int a[MAXN];
 6 
 7 int main(void){
 8     int n, k, ans=0, x, pos=0;
 9     cin >> n >> k;
10     for(int i=0; i<n; i++){
11         cin >> x;
12         if(x<=k&&(x|k)<=k){//**注意这里的括号一定不能少,被坑惨了。。。
13             a[pos++]=x;
14             ans|=x;
15         }
16     }
17     if(!pos||ans<k){
18         cout << 0 << endl;
19         return 0;
20     }
21     sort(a, a+pos);
22     int cnt=n, key;
23     while(k){
24         int cc=0, gg=0;
25         for(int i=0; i<pos; i++){
26             if(!a[i]){
27                 continue;
28             }
29             if(a[i]%2){
30                 cc+=1;
31             }else{
32                 gg+=1;
33             }
34             a[i]>>=1;
35         }
36         key=k%2;
37         k>>=1;
38         if(key){  //***k当前二进制位为1,我们可以选择把所有当前位二进制为1的元素删掉
39             cnt=min(cnt, cc);
40         }else{  //***k当前二进制位为0,我们可以选择把所有当前位二进制为0的元素删掉
41             cnt=min(cnt, gg);
42         }
43     }
44     cout << cnt << endl;
45     return 0;
46 }
原文地址:https://www.cnblogs.com/geloutingyu/p/6291143.html