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 }
  • 相关阅读:
    852. Peak Index in a Mountain Array
    841. Keys and Rooms
    832. Flipping an Image
    821. Shortest Distance to a Character
    824. Goat Latin
    如何生成git的公钥和私钥
    学习笔记
    加快JavaScript加载和执行效率
    PO BO VO DTO POJO DAO概念及其作用
    jvm 垃圾回收区的形象说明
  • 原文地址:https://www.cnblogs.com/geloutingyu/p/6291143.html
Copyright © 2011-2022 走看看