BZOJ 1688: Disease Manangement (子集枚举)
Disease Manangement
Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u
Description
Input
* Lines 2..N+1: Line i+1 describes the diseases of cow i with a list of 1 or more space-separated integers. The first integer, d_i, is the count of cow i's diseases; the next d_i integers enumerate the actual diseases. Of course, the list is empty if d_i is 0.
Output
Sample Input
- 6 3 2
- 0
- 1 1
- 1 2
- 1 3
- 2 2 1
- 2 2 1
Sample Output
- 5
Hint
If FJ milks cows 1, 2, 3, 5, and 6, then the milk will have only two diseases (#1 and #2), which is no greater than K (2).
- 6 3 2 N,D,k
- 0 第一列是奶牛携带的疾病个数,后面表示疾病的种类
- 1 1
- 1 2
- 1 3
- 2 2 1
- 2 2 1 携带两种疾病,种类为1,2两类
x&=(x-1)表示将x转化为2进制,最低的为1的位变成0,看含有的1的个数。
- 这是“位运算”中的一种很经典的用法,“&”是“与”的意思。它具体点的意思就是把x的二进制表示数最右边的一个1变成0 例如:
- e1:
- x = 01001000
- x-1 = 01000111
- x&(x-1)= 01000000
- e2:
- x = 01001001
- x-1 = 01001000
- x&(x-1)= 01001000
- 可见只有前后x与x-1中的两个运算数都是 1 的时候结果才是1.
同理“|”运算也是两个运算数有一个为1就是1.
具体解释在代码中- AC代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- int n,d,k;
- int N[+];
- bool judge(int x)
- {
- int c=;
- while(x)
- {
- c++; // 将x转化为2进制,看含有的1的个数。
- x&=(x-); //将最低的为1的位变成0
- }
- if(c<=k) //限制个数
- return ;
- else
- return ;
- }
- int main()
- {
- int s,t,total=;
- scanf("%d%d%d",&n,&d,&k);
- for(int i=; i<n; i++)
- {
- cin>>s;
- for(int j=; j<s; j++)
- {
- cin>>t;
- N[i]|=<<(t-); //1<<t-1(1的二进制数整体向左移t-1位)
- //一起把二进制数的位数对应着来看,这两个数在这一位上有1的结果就是1,否则是0
- }
- }
- for(int i=; i<(<<d); i++) //i<(1<<d)是当i不小于(1左移d位的数)时终止循环,枚举各子集对应的编码0,1,2,..2^d-1
- {
- if(judge(i))
- {
- int f=;
- for(int j=; j<n; j++)
- {
- if((N[j]|i)==i) f++; //对应N[j]与i的并集与i相等,说明N[j]是它的子集
- }
- if(f>total)
- total=f;
- }
- }
- cout<<total<<endl;
- return ;
- }
BZOJ 1688: Disease Manangement (子集枚举)的更多相关文章
- 1688: [Usaco2005 Open]Disease Manangement 疾病管理( 枚举 )
我一开始写了个状压dp..然后没有滚动就MLE了... 其实这道题直接暴力就行了... 2^15枚举每个状态, 然后检查每头牛是否能被选中, 这样是O( 2^15*1000 ), 也是和dp一样的时间 ...
- 1688: [Usaco2005 Open]Disease Manangement 疾病管理
1688: [Usaco2005 Open]Disease Manangement 疾病管理 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 413 So ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- 【最小生成树+子集枚举】Uva1151 Buy or Build
Description 平面上有n个点(1<=N<=1000),你的任务是让所有n个点连通,为此,你可以新建一些边,费用等于两个端点的欧几里得距离的平方. 另外还有q(0<=q< ...
- UVA11825 黑客的攻击 Hackers' Crackdown 状压DP,二进制,子集枚举
题目链接Click Here [题目描述] 假如你是一个黑客,侵入了一个有着\(n\)台计算机(编号为\(1.2.3....n\))的网络.一共有\(n\)种服务,每台计算机都运行着所有服务.对于每台 ...
- BZOJ1688 Disease Manangement 疾病管理
Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作
#include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理
Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) is running through the fa ...
- 【BZOJ】1688: [Usaco2005 Open]Disease Manangement 疾病管理(状压dp)
http://www.lydsy.com/JudgeOnline/problem.php?id=1688 很水的状压.. 提交了很多次优化的,但是还是100msT_T #include <cst ...
随机推荐
- bzoj1433 [ZJOI2009]假期的宿舍(最大流)
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1717 Solved: 754[Submit][Stat ...
- javaIO流小结(1)
UTF-8的字节占多少个字节? 常用中文字符用utf-8编码占用3个字节(大约2万多字),超大字符集中要占4个字节.在内存中是2个字节,真正写到硬盘上面的是3个字节. GBK.GB2312汉字占2个字 ...
- Unity3d个人信息开发流程
1.首先先对需要交互的属性进行G/S,比如声明金币的属性 private int _coin; public String Coin{ get{ return _coin; } set{ return ...
- bzoj1036 zjoi2008 树的统计 count
填坑= =第一道裸树剖 #include<cstdio> #include<algorithm> #include<cstring> #include<cst ...
- Spring Boot(spring mvc升级版)
周末挤出了一些时间,学了点东西,总结了一下,可能还有自己理解不到位的地方,希望大家一起交流学习,好东西要大家一起分享嘛~.时间有点紧张,所以样式没有来及做很好的调整,大家就凑活着看吧. Spring ...
- [PWA] 4. Hijacking Request
We want to do offline first, the first thing we need to do is we should able to catch the browser re ...
- Android应用打包安装过程具体解释
Android应用打包安装过程(Run as Android Application ): 1,过程:Android Project --> Compilation and Packaging ...
- NETSH WINSOCK RESET这条命令的含义和作用?
简单来说netsh winsock reset命令含义是重置 Winsock 文件夹.假设一台机器上的Winsock协议配置有问题的话将会导致网络连接等问题,就须要用netsh winsock res ...
- linux sysvinit与upstart [转]
linux sysvinit与upstart(1) linux sysvinit与upstart(2) linux sysvinit与upstart(3)
- uva 1391 Astronauts(2-SAT)
/*翻译好题意 n个变量 不超过m*2句话*/ #include<iostream> #include<cstdio> #include<cstring> #inc ...