這題簡單來說就是,給定$n$個字串,還有一個目標字串$S$,要求在這$n$個字串裡選出幾個,使得把他們逐位加起來之後每位都和$S$不一樣。首先當$S$裡沒有$0$的時候顯然什麼都不取就可以了,而如果有一個位子$x$是$0$的話,因為題目保證第$i$個字串的第$i$項會是$1$,那麼就考慮直接取第$x$個字串看看,這樣可以發現:不管之後如何選,$x$那個位子的值只會增不會減,也就是之後可以完全忽略他了。這樣就得到了一個非常簡潔的算法:當還有位子的值和$S$的那個位子的值一樣時,就取對應的那個字串,一直作到滿足目標為止就可以了。
code :
#include<bits/stdc++.h> using namespace std; const int maxn=100+10 ; char G[maxn][maxn] ; int a[maxn],now[maxn] ; vector<int> v ; main() { int n ; scanf("%d",&n) ; for(int i=1;i<=n;i++) scanf("%s",G[i]+1) ; for(int i=1;i<=n;i++) scanf("%d",&a[i]) ; while(1) { bool found=0 ; vector<int> v2 ; for(int i=1;i<=n;i++) if(now[i]==a[i]) { found=1 ; v2.push_back(i) ; v.push_back(i) ; } if(!found) break ; for(auto i : v2) for(int j=1;j<=n;j++) if(G[i][j]=='1') now[j]++ ; } printf("%d\n",v.size()) ; for(int i=0;i<v.size();i++) printf("%d%c",v[i],i+1==v.size()?'\n':' ') ; }
沒有留言:
張貼留言