• Automatic Control Machine(bitset+二进制枚举)


    Automatic Control Machine

    题解:(bitset)应用二进制枚举

    AC_Code:

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cmath>
     4 #include <bitset>
     5 #include <string>
     6 #include <algorithm>
     7 #include <cstring>
     8 using namespace std;
     9 typedef long long ll;
    10 const int maxn = 505;
    11 const double eps = 1e-8;
    12 
    13 char s[maxn];
    14 bitset<maxn>p[20];
    15 
    16 int main()
    17 {
    18     int t; scanf("%d",&t);
    19     while( t-- ){
    20         int n,m; scanf("%d%d",&n,&m);
    21         for(int i=1;i<=m;i++){
    22             scanf("%s",s+1);
    23             p[i].reset();   //reset:把p[i]中所有二进制位都置为"0"
    24             for(int j=1;j<=n;j++){
    25                 if( s[j]=='1' ) p[i].set(j);    //set(j):把p[i]的j位置设成"1"
    26             }
    27         }
    28 
    29         int base = (1<<m)-1, ans=20;
    30         for(int i=0;i<=base;i++){   //暴力枚举每一种组合,i的二进制:第x位"0"代表不选x,第x位为"1"代表选x
    31             bitset<maxn>cnt;
    32             int k=0;
    33             for(int j=0;j<m;j++){
    34                 if( i&(1<<j) ){
    35                     cnt |= p[j+1];
    36                     k++;
    37                 }
    38             }
    39             if((int)cnt.count()==n ) ans=min(ans,k);
    40         }
    41         if( ans==20 ) printf("-1
    ");
    42         else printf("%d
    ",ans);
    43     }
    44     return 0;
    45 }

    顺便总结一点(bitset)的用法:

    bitset的定义和初始化

    bitset<n> b; 
    b有n位,每位都为0

     

    bitset<n> b(u); 
    b是unsigned long型u的一个副本

    
    

    bitset<n> b(s); 
    b是string对象s中含有的位串的副本

    
    

    bitset<n> b(s, pos, n); 
    b是s中从位置pos开始的n个位的副本

    
    


    bitset的操作

    b.any() 
    b中是否存在置为1的二进制位?

    
    

    b.none() 
    b中不存在置为1的二进制位吗?

    
    

    b.count() 
    b中置为1的二进制位的个数

    
    

    b.size() 
    b中二进制位的个数

    
    

    b[pos] 
    访问b中在pos处的二进制位

    
    

    b.test(pos) 
    b中在pos处的二进制位是否为1?

    
    

    b.set() 
    把b中所有二进制位都置为1

    
    

    b.set(pos) 
    把b中在pos处的二进制位置为1

    
    

    b.reset() 
    把b中所有二进制位都置为0

    
    

    b.reset(pos) 
    把b中在pos处的二进制位置为0

    
    

    b.flip() 
    把b中所有二进制位逐位取反

    
    

    b.flip(pos) 
    把b中在pos处的二进制位取反

  • 相关阅读:
    设计模式开始--工厂模式
    设计模式开始--UML类之间关系表示
    设计模式开始1--不明觉厉
    Gas Station
    Validate Binary Search Tree
    Word Ladder
    (转)基于快速排序的TOPK算法
    Number of 1 Bits
    Word Search
    Rotate Array
  • 原文地址:https://www.cnblogs.com/wsy107316/p/13531712.html
Copyright © 2020-2023  润新知