细菌(disease) 位运算

 

细菌(disease)

题目描述

近期,农场出现了D(1≤D≤15)种细菌。John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格。请你帮助John计算出最多可以选择多少头奶牛。

输入

第1行:三个整数N,D,K。
下面N行:第i行表示一头牛所携带的细菌情况。第一个整数di表示这头牛所携带的细菌种类数,后面di个整数表示这些细菌的各自种类标号。

输出

一个数M,最大可选奶牛数。

样例输入

6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1

样例输出

5

提示

样例说明:选择l,2,3,5,6头奶牛,只有1#和2#两种细菌。

&运算符:

1&1 = 1, 0 & 1 = 0, 0 & 0 = 0;二进制数  1111

          & 1001

       得到 1001

因此可以把所有细菌变成二进制数,1, 2, 4,8,……

因此可以用枚举细菌 来 暴力检索 奶牛是否合适。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <climits>
using namespace std;
 
const int maxn = 10010;
const int INF = 0x3f3f3f3f;
 
int Cnt(int x){
    int cnt = 0;
    while(x > 0){
        if(x&1) cnt++;
        x = x>>1;
    }
    return cnt;
}
 
int main() {
    int n, m, x, ans, num, a[maxn] = {0};
    ios::sync_with_stdio(false);
    cin >> n >> m >> ans;
    for (int i = 0; i < n; i++){
        cin >> num;
        for (int j = 0; j < num; j++) {
            cin >> x;
            a[i] += 1<<(x-1);
        }
    }
    int res = 0, MAX = 0;
    for(int i = 1; i <= (1 << m); i++){
        if(Cnt(i) <= ans){
            res = 0;
            for(int j = 0; j < n; j++){
                if((a[j] & i) == a[j]) res++;
            }
            MAX = max(res, MAX);
        }
    }
    cout << MAX << endl;
    return 0;
}
View Code

 

posted on 2016-07-30 17:04  disppr  阅读(374)  评论(0编辑  收藏  举报