• 细菌(disease) (位运算)(状态压缩)


    细菌(disease)

    时间限制: 1 Sec  内存限制: 64 MB
    提交: 9  解决: 5
    [提交][状态][讨论版]

    题目描述

    近期,农场出现了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#两种细菌。

    【分析】看的别人的题解,第一次见这种做法,位运算,很叼的样子。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <cmath>
    #include <time.h>
    #include <string>
    #include <map>
    #include <stack>
    #include <vector>
    #include <set>
    #include <queue>
    #define inf 0x3f3f3f3f
    #define mod 1000000007
    typedef long long ll;
    using namespace std;
    const int N=33010;
    int n,k,d,m,t;
    int a[N],cnt[33000];
    
    int fun(int x)
    {
        int c=0;
        while(x)
        {
            if(x&1)c++;x>>=1;
        }return c;
    }
    int main() {
        memset(a,0,sizeof(a));
        memset(cnt,0,sizeof(cnt));
        cin>>n>>d>>k; int ans=0;
        for(int i=0;i<n;i++)
        {
            cin>>t;
            for(int j=0;j<t;j++)
            {cin>>m;
           a[i]+=pow(2,m-1);
           }
        }
    
        for(int i=0;i<=pow(2,d);i++)
        {
            if(fun(i)>k)continue;
            for(int j=0;j<n;j++)
            {
                if((i|a[j])==i)cnt[i]++;
            }
            ans=max(ans,cnt[i]);
        }
    
       cout<<ans<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    修改表中的列
    查看表中都有什么约束
    数据库关系图
    删除约束
    T_SQL 语句想已有数据表添加约束
    判断回文联
    python自定义函数可以向前引用不用声明
    所有参数的和乘以基数
    子字符串在目标字符串中出现的次数
    除二取余倒序排列
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/5720463.html
Copyright © 2020-2023  润新知