zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    算法竞赛入门经典习题2-3 韩信点兵
    ios入门之c语言篇——基本函数——5——素数判断
    ios入门之c语言篇——基本函数——4——数值交换函数
    144. Binary Tree Preorder Traversal
    143. Reorder List
    142. Linked List Cycle II
    139. Word Break
    138. Copy List with Random Pointer
    137. Single Number II
    135. Candy
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6291143.html
Copyright © 2011-2022 走看看