zoukankan      html  css  js  c++  java
  • 细菌(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
  • 相关阅读:
    List转换为Datatable
    C# NPOI导出Excel和EPPlus导出Excel比较
    NPOI导出excel2007
    C#中的事务TransactionScope
    switch,case语句易误区
    消息队列mq总结
    一文搞定十大经典排序算法(Java实现)
    常见数据结构与算法整理总结(下)
    常见数据结构与算法整理总结(上)
    mysql开发常用技巧总结
  • 原文地址:https://www.cnblogs.com/cshg/p/5721304.html
Copyright © 2011-2022 走看看