Codeforces 549B. Looksery Party 構造

題目鏈接: http://codeforces.com/problemset/problem/549/B

題意:

你現在擁有一個 nnn*n0101 數組 aa ,和一個長爲 nn 的數組 bb,現在要你選出一些行的集合 XX,使得對於每一列 jj 所有行的和 a[i][j](iX)\sum a[i][j] (i\in X) 不等於 bjb_j

做法:

很是神奇的構造方法,對於任意一個時刻,如果沒有一個 bj=0b_j=0 ,那麼我們就可以一個都不選,結束選擇。

如果存在一個列的 bj=0b_j=0 ,那麼就選擇這第 jj 個人,因爲他一定會給自己發信息,所以這一列 jj 就能保證不等於 bjb_j

如此貪心下去就可以了,發現好像確實不會有一種情況不滿足。

代碼

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const int maxn=105;
int mp[maxn][maxn],n;
int a[maxn],vis[maxn];
vector<int> ans;
int main(){
    scanf("%d",&n);
    rep(i,1,n)
        rep(j,1,n)
            scanf("%1d",&mp[i][j]);

    rep(i,1,n){
        scanf("%d",&a[i]);
    }
    int f=1;
    while(f){
        f=0;
        rep(i,1,n){
            if(!vis[i]&&a[i]==0){
                vis[i]=1; f=1;
                ans.push_back(i);
                rep(j,1,n){
                    if(mp[i][j]&&!vis[j]){
                        a[j]=a[j]-1;
                    }
                }
            }
        }
    }
    printf("%d\n",ans.size());
    if(ans.size()){
        sort(ans.begin(),ans.end());
        for(int i=0;i<ans.size();i++){
            printf("%d%c",ans[i],i==ans.size()-1?'\n':' ');
        }

    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章