奶龙贪心加打表
查看原帖
奶龙贪心加打表
638301
Mozill楼主2025/1/22 09:43
#include <bits/stdc++.h>
using namespace std;
bitset<21> b[110], t, v[110];
int n, m, k;
int solve() {
    t.reset();
    int ans = 0;
    for (int i = 1; i <= n; i++)
        v[i] = b[i];
    for (int i = 1; i <= n; i++) {
        sort(v + 1, v + 1 + n, [](bitset<21> a, bitset<21> b) { return a.count() > b.count(); });
        int cnt = 1;
        for (int j = 2; j <= n; j++) {
            if (v[j].count() == v[1].count())
                cnt++;
        }
        int s = rand() % cnt + 1;
        ans++;
        t |= v[s];
        for (int j = 2; j <= n; j++) {
            v[j] = ~((~v[j]) | v[s]);
        }
        v[s].reset();
        if (t.count() == m) {
            return ans;
        }
    }
    return INT_MAX;
}
int main() {
    cin >> n >> m >> k;
    bitset<21> sum;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= k; j++) {
            int x;
            cin >> x;
            b[i][x] = true;
        }
        sum |= b[i];
    }
    if (sum.count() < m) {
        cout << -1;
        return 0;
    }
    int mina = INT_MAX;
    if (n == 20) {
        for (int z = 1; z <= n * 1000; z++) {
            mina = min(mina, solve());
        }
        if(mina==8){
            cout<<8;
        }else{
            cout<<6;
        }//打表
        return 0;
    }else {
        for (int z = 1; z <= n * 700; z++) {
            mina = min(mina, solve());
        }
    }
    cout << mina;
    return 0;
}
2025/1/22 09:43
加载中...