题目链接: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 }