1 条题解

  • 0
    @ 2023-5-27 17:11:18

    从0-2^B枚举即可,将i和前面存下的所有答案对比,满足条件就存进去,这里我们判不同位的个数可以直接用异或(相同为0不同为1),然后用函数求出异或后'1'的个数即可

    #include <map>
    #include <queue>
    #include <cmath>
    #include <cstdio>
    #include <string>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    #define lowbit(a) (a&(-a))
    #define _mid(a,b) ((a+b)/2)
    #define _mem(a,b) memset(a,0,(b+3)<<2)
    #define fori(a) for(int i=0;i<a;i++)
    #define forj(a) for(int j=0;j<a;j++)
    #define ifor(a) for(int i=1;i<=a;i++)
    #define jfor(a) for(int j=1;j<=a;j++)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define IN freopen("in.txt","r",stdin)
    #define OUT freopen("out.txt","w",stdout)
    #define IO do{\
        ios::sync_with_stdio(false);\
        cin.tie(0);\
        cout.tie(0);}while(0)
    using namespace std;
    typedef long long ll;
    const int maxn =  150+10;
    const int INF = 0x3f3f3f3f;
    const int inf = 0x3f;
    const double EPS = 1e-7;
    const double Pi = acos(-1);
    const int MOD = 1e9+7;
    int Minbit;
    int a[maxn];
    int cnt;
    bool juge(int x){
        fori(cnt)
            if(__builtin_popcount(x^a[i])<Minbit)    //编译器内置函数,求出x^a[i]的二进制数中'1'的个数
                return false;
        return true;
    }
    int main(){
        int n,b;
        cin >> n >>b >>Minbit;
        fori(1<<b){
            if(juge(i))
                a[cnt++] = i;
            if(cnt == n)
                break;
        }
        int cn = 1;
        fori(cnt){
            cout <<a[i];
            if(cn%10==0)
                cout << endl;
            else if(i!=cnt-1)
                cout <<" ";
            cn++;
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1631
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    45
    已通过
    34
    上传者