细菌(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;
}

时间: 2024-10-10 01:49:35

细菌(disease) (位运算)(状态压缩)的相关文章

细菌(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

FZU1892接水管游戏-BFS加上简单的状态压缩和位运算处理

原题地址:http://acm.fzu.edu.cn/problem.php?pid=1892 Problem 1892 接水管游戏 Accept: 108    Submit: 498 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description 接水管游戏的规则如下: 1.在N*N大小的方格上有两个特别的水管,分别为进水口和出水口: 2.有7种1*1大小的水管需要放在这N*N大小的方格内,使得水流能够从进水口经过这些

二进制状态压缩及位运算

位运算符: 与(&),或(|),非(~), 异或(^); 移位运算: 1.左移:在二进制表示下把数字同时向左移动,低位以0填充,高位越界后舍弃 1 << n = 2^n, n << 1 = 2n 2.算术右移:在二进制补码表示下把数字同时向右移动,高位以符号位填充,低位越界后舍弃 n >> 1 = n/2.0(向下取整) eg:(-3)>> 1 = -2, 3 >> 1 = 1;  二进制状态压缩,是指将一个n位的 bool 数组用 n

ACM学习历程—ZOJ3471 Most Powerful(dp &amp;&amp; 状态压缩 &amp;&amp; 记忆化搜索 &amp;&amp; 位运算)

Description Recently, researchers on Mars have discovered N powerful atoms. All of them are different. These atoms have some properties. When two of these atoms collide, one of them disappears and a lot of power is produced. Researchers know the way

状态压缩中常用的位运算(DP)

面对位运算,一直很无感...可能数学太差,脑洞太小. 1.首先是最基本的: 与&,或|,非~,异或^. 2.获取一个或者多个固定位的值: 假设 x = 1010(二进制),我们要取左数第二位的值,可以用(x &(1<<1)); 还可用(x&(3<<2))来取得第三位和第四位. 3.把一个或者多个固定的位上的值清零: 同样 x = 1010(二进制),我们要使左数第二位的值清零,可以用(x^(1<<1)). 待续..

状态压缩(位运算)

位运算优先级: ~ << >> & ^ | 常用运算: 置位(set bit)将第bit位置为1 A |= 1<<bit 清位(clear bit)将第bit位置为0 A &= ~(1<<bit) 测位(test bit)判断第bit位是否为1 (A&1<<bit)!=0 (A>>bit&1)!=0 取最后一个非0位 A&-A  原理是:A=0000 0100     -A是将A按位取反然后+1

poj 2777 Count Color(线段树、状态压缩、位运算)

Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38921   Accepted: 11696 Description Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds of problems. Here, we get a new problem.

细菌 状态压缩

1531: 细菌(disease) 时间限制: 1 Sec  内存限制: 64 MB提交: 17  解决: 9[提交][状态][讨论版] 题目描述 近期,农场出现了D(1≤D≤15)种细菌.John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶,但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格.请你帮助John计算出最多可以选择多少头奶牛. 输入 第1行:三个整数N,D,K. 下面N行:第i行表示一头牛所携带的细菌情况.第一个整数di表示这头牛所携带的细菌种类

java中通过位运算实现多个状态的判断

通过 <<  |  & ~ 位运算,实现同时拥有多个状态 通过 << 定义数据的状态 public interface LogConstants { /** * 消耗标记 */ short COST_ASSET = 1 << 0; short COST_GOLD = 1 << 1; short COST_BINDGOLD = 1 << 2; short COST_SOPH = 1 << 3; short COST_STRSOU