zoukankan      html  css  js  c++  java
  • c++ stl bitset

    c++ bitset 是个比较有用的东西

    说的高深点这是:

    C++语言的一个类库,用来方便地管理一系列的bit位而不用程序员自己来写代码。

    bitset除了可以访问指定下标的bit位以外,还可以把它们作为一个整数来进行某些统计。

    说的简单一点,这是:

    一个可以用位运算的数组,也用于32位的压缩。

    是不是简单易懂,

    他的一般定义:

    #include<bitset>
    bitset<2000000>f;

    就可以使用f:

    f[i]=a; f=f<<a; 如此

    接下来附两道:



    1302: 装箱问题

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 278  解决: 185
    [提交][状态][讨论版]

    题目描述

    有一个箱子容量为v(正整数,0<=v<=20000),同时有n个物品(0<n<=30),每个物品有一个体积(正整数)。
    要求从n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。

    输入

    箱子的容量v
    物品数n
    接下来n行,分别表示这n个物品的体积

    输出

    箱子剩余空间

    样例输入

    24
    6
    8
    3
    12
    7
    9
    7

    样例输出

    0

    提示

     

    来源

    [提交][状态][讨论版]

    这是一道水到不能再水的水题,先附普通版,
     1 #include<iostream>
     2 #include<algorithm>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<cstdlib>
     7 #include<vector>
     8 using namespace std;
     9 typedef long long ll;
    10 typedef long double ld;
    11 typedef pair<int,int> pr;
    12 const double pi=acos(-1);
    13 #define rep(i,a,n) for(int i=a;i<=n;i++)
    14 #define per(i,n,a) for(int i=n;i>=a;i--)
    15 #define Rep(i,u) for(int i=head[u];i;i=Next[i])
    16 #define clr(a) memset(a,0,sizeof(a))
    17 #define pb push_back
    18 #define mp make_pair
    19 #define fi first
    20 #define sc second
    21 #define pq priority_queue
    22 #define pqb priority_queue <int, vector<int>, less<int> >
    23 #define pqs priority_queue <int, vector<int>, greater<int> >
    24 #define vec vector
    25 ld eps=1e-9;
    26 ll pp=1000000007;
    27 ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;}
    28 ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;}
    29 //void add(int x,int y,int z){ v[++e]=y; next[e]=head[x]; head[x]=e; cost[e]=z; }
    30 int dx[5]={0,-1,1,0,0},dy[5]={0,0,0,-1,1};
    31 ll read(){ ll ans=0; char last=' ',ch=getchar();
    32 while(ch<'0' || ch>'9')last=ch,ch=getchar();
    33 while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
    34 if(last=='-')ans=-ans; return ans;
    35 }
    36 //头文件
    37 
    38 
    39 
    40 
    41 int f[20000]; 
    42 int main()
    43 {
    44     int v=read(),n=read(); f[0]=1;
    45     rep(i,1,n) {
    46         int a=read();
    47         per(x,v,a)
    48           f[x]=f[x]|f[x-a];
    49     }
    50     per(i,v,0)
    51       if (f[i]) {
    52         cout<<v-i; break;
    53     }
    54 } 
    View Code
     
    再来bitset:
     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define LL long long
     7 #define rep(i,a,b) for (int i=a;i<=b;i++)
     8 #define per(i,a,b) for (int i=a;i>=b;i--)
     9 #define inf 1<<29
    10 #define clr(i,c) memset(i,c,sizeof(i))
    11 using namespace std;
    12 inline int read(){
    13     int x=0,f=1; char ch=getchar();
    14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 
    16     return x*f; 
    17 }
    18 #include<bitset>
    19 bitset<20000>f;
    20 int main()
    21 { 
    22   f[0]=1;
    23   int v=read();
    24   int n=read();
    25   while (n--){
    26       int x=read();
    27       f=f|(f<<x);
    28   }
    29   per(i,v,0)
    30     if (f[i]){
    31         printf("%d
    ",v-i);
    32         return 0;
    33     } 
    34 }
    View Code
    又来一题:

    2096: bitset习题

    时间限制: 1 Sec  内存限制: 128 MB
    提交: 29  解决: 21
    [提交][状态][讨论版]

    题目描述

    小呆开始研究集合论了,他提出了关于一个数集四个问题:
    1. 子集的异或和的算术和。
    2. 子集的异或和的异或和。
    3. 子集的算术和的算术和。
    4. 子集的算术和的异或和。
    目前为止,小呆已经解决了前三个问题,还剩下最后一个问题还没有解决,他决定把
    这个问题交给你,未来的集训队队员来实现。

     

    输入

    第一行,一个整数 n。
    第二行,n 个正整数,表示 a1, a2, …, an

     

    输出

    一行,包含一个整数,表示所有子集和的异或和。

     

    样例输入

    21 3

    样例输出

    6【样例解释】6 = 1 ⊗ 3 ⊗ (1 + 3)【数据规模与约定】数据分为 A,B,C 三类。A 类数据 (20%) 保证:ai > 0,1 ≤ n ≤ 10。B 类数据 (40%) 保证:ai > 0,1 ≤ n ≤ 1000,∑ ai ≤ 10000。C 类数据 (40%) 保证:ai > 0,1 ≤ n ≤ 1000,∑ ai ≤ 2000000。另外,不保证集合中的数满足互异性,即有可能出现 ai = aj 且 i ̸= j。

    提示

     

    来源

     
    [提交][状态][讨论版]
    上代码:
     

     
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cmath>
     4 #include<cstring>
     5 #include<algorithm>
     6 #define LL long long
     7 #define rep(i,a,b) for (int i=a;i<=b;i++)
     8 #define per(i,a,b) for (int i=a;i>=b;i--)
     9 #define inf 1<<29
    10 #define clr(i,c) memset(i,c,sizeof(i))
    11 using namespace std;
    12 inline int read(){
    13     int x=0,f=1; char ch=getchar();
    14     while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    15     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 
    16     return x*f; 
    17 }
    18 #include<bitset>
    19 bitset<2000000>f;
    20 int ans;
    21 int main()
    22 { 
    23   f[0]=1;
    24   int n=read();
    25   while (n--){
    26       int x=read();
    27       f=f^(f<<x);
    28   }
    29   rep(i,1,2000000)
    30     if (f[i]) ans^=i;
    31   cout<<ans<<endl; 
    32 }
    View Code


    一堆函数:

     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处的二进制位取反

    b.to_ulong()

    b中同样的二进制位返回一个unsigned long值

    os << b

    b中的位集输出到os流

  • 相关阅读:
    perl 监控网站域名劫持
    OpenLayers访问Geoserver发布的地图
    基于OpenLayers的地图封装Javascript类定义
    Linux_正则表达式
    Linux_正则表达式
    帆软出品: 7点搞定制药企业数据分析系统开发需求
    帆软出品: 7点搞定制药企业数据分析系统开发需求
    Geoserver地图样式SLD资料收集
    GeoServer地图开发解决方案:地图数据处理篇
    Geoserver发布shapfile,中文字段乱码问题
  • 原文地址:https://www.cnblogs.com/SXia/p/6747784.html
Copyright © 2011-2022 走看看