白い牛の月のシーズン23 A.膜オフレコ

リンク
の質問の意味は:
すべての敵は内に配置されている \(N * M \)グリッド、
合計することができる(\ A)\一列に敵を破壊する時間、 \(B \)回列全体の敵を破壊します
敵は一掃しようとしていることができます
アイデアを:
バイナリ列挙選択線の状態
の前処理各状態がどのように多くの列の敵(接頭辞と)を破壊することができます
\(CNT [i]とすると、\)である \(I \)状態の下でどのように多くの列なしの敵
コード:

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
typedef long long ll;
 
char s[21][100001];
int cnt[1100000];
 
int main() {
    //freopen("in.txt","r",stdin);
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;cin>>T;
    while(T--) {
        int n,m,a,b;
        cin>>n>>m>>a>>b;
        for(int i=0;i<1<<n;i++) cnt[i]=0;
        for(int i=1;i<=n;i++) cin>>s[i]+1;
        for(int j=1;j<=m;j++) {
            int t=0;
            for(int i=1;i<=n;i++)
                if(s[i][j]=='*')
                    t|=1<<i-1;
            cnt[t]++;
        }
        for(int i=0;i<n;i++)
            for(int j=0;j<1<<n;j++)
                if(j&1<<i)
                    cnt[j]+=cnt[j-(1<<i)];
        bool f=false;
        for(int i=0;i<1<<n;i++)
            if(__builtin_popcount(i)<=a&&m-cnt[i]<=b) {
                f=true;
                break;
            }
        if(f==true) cout<<"yes"<<endl;
        else cout<<"no"<<endl;
    }
    return 0;
}

おすすめ

転載: www.cnblogs.com/c4Lnn/p/12549697.html