B3622题解

· · 题解

思路

想法

考虑使用 bitset 进行求解。

关于bitset

这里有关于 bitset 的介绍。

由于内存地址是按字节即 byte 寻址,而非比特 bit,一个 bool 类型的变量,虽然只能表示 0/1, 但是也占了 1 byte 的内存。bitset 就是通过固定的优化,使得一个字节的八个比特能分别储存 8 位的 0/1。对于一个 4 字节的 int 变量,在只存 0/1 的意义下,bitset 占用空间只是其\frac{1}{32},计算一些信息时,所需时间也是\frac 1{32}

以上内容来自 oi-wiki。

实现

对于每一次循环,都要输出 i 的二进制,并转换为 Y/N(这部分的推理过程可以参考其他题解),而 bitset 可以查看每一位的 0/1,相当于将数字转为二进制,将 bs 赋值为 i 并输出Y/N 即可。

代码

#include <bits/stdc++.h>
using namespace std;
bitset<1000>bs;
int main()
{
    int n;
    cin>>n;
    for(int i=0;i<(1<<n);i++){
        bs=i;
        for(int j=n-1;j>=0;j--){
            if(bs[j])
            cout<<"Y";
            else
            cout<<"N";

        }
        cout<<endl;
    }
    return 0;
}