題目鏈接: http://codeforces.com/problemset/problem/549/B
題意:
你現在擁有一個 的 數組 ,和一個長爲 的數組 ,現在要你選出一些行的集合 ,使得對於每一列 所有行的和 不等於 。
做法:
很是神奇的構造方法,對於任意一個時刻,如果沒有一個 ,那麼我們就可以一個都不選,結束選擇。
如果存在一個列的 ,那麼就選擇這第 個人,因爲他一定會給自己發信息,所以這一列 就能保證不等於 。
如此貪心下去就可以了,發現好像確實不會有一種情況不滿足。
代碼
#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;
}