2015年6月8日 星期一

[CF 549B] Looksery Party

作法:

這題簡單來說就是,給定$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':' ') ;
}
 

沒有留言:

張貼留言