细菌(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#两种细菌。
分析:考虑将数转化为二进制,状态压缩;
代码:
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <algorithm>
- #include <climits>
- #include <cstring>
- #include <string>
- #include <set>
- #include <map>
- #include <queue>
- #include <stack>
- #include <vector>
- #include <list>
- #include <ext/rope>
- #define rep(i,m,n) for(i=m;i<=n;i++)
- #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
- #define vi vector<int>
- #define pii pair<int,int>
- #define mod 1000000007
- #define inf 0x3f3f3f3f
- #define pb push_back
- #define mp make_pair
- #define fi first
- #define se second
- #define ll long long
- #define pi acos(-1.0)
- const int maxn=3e5+;
- const int dis[][]={{,},{-,},{,-},{,}};
- using namespace std;
- using namespace __gnu_cxx;
- ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
- ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p;p=p*p;q>>=;}return f;}
- int n,m,ans[maxn],a[],ma;
- int work(int p)
- {
- int cnt=;
- while(p){if(p&)cnt++;p>>=;}
- return cnt;
- }
- int main()
- {
- int i,j,k,t;
- scanf("%d%d%d",&n,&m,&k);
- rep(i,,n-)
- {
- scanf("%d",&j);
- while(j--)
- {
- scanf("%d",&t);
- a[i]+=qpow(,t-);
- }
- }
- rep(i,,qpow(,m)-)
- {
- if(work(i)>k)continue;
- rep(j,,n-)
- {
- if((i|a[j])==i)ans[i]++;
- }
- ma=max(ma,ans[i]);
- }
- printf("%d\n",ma);
- //system ("pause");
- return ;
- }
附排除法,排除掉m-k个细菌,剩下的牛取最大值即可;
代码:
- #include <iostream>
- #include <cstdio>
- #include <cstdlib>
- #include <cmath>
- #include <algorithm>
- #include <climits>
- #include <cstring>
- #include <string>
- #include <set>
- #include <map>
- #include <queue>
- #include <stack>
- #include <vector>
- #include <list>
- #include <ext/rope>
- #define rep(i,m,n) for(i=m;i<=n;i++)
- #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
- #define vi vector<int>
- #define pii pair<int,int>
- #define mod 1000000007
- #define inf 0x3f3f3f3f
- #define pb push_back
- #define mp make_pair
- #define fi first
- #define se second
- #define ll long long
- #define pi acos(-1.0)
- const int maxn=1e3+;
- const int dis[][]={{,},{-,},{,-},{,}};
- using namespace std;
- using namespace __gnu_cxx;
- ll gcd(ll p,ll q){return q==?p:gcd(q,p%q);}
- ll qpow(ll p,ll q){ll f=;while(q){if(q&)f=f*p;p=p*p;q>>=;}return f;}
- int n,m,a[maxn][],p[maxn],ma;
- void dfs(int cnt,int now,int p[])
- {
- int q[maxn]={};
- for(int i=;i<=n;i++)
- q[i]=a[i][now]||p[i];
- if(cnt==)
- {
- int ans=;
- for(int i=;i<=n;i++)
- if(!q[i])ans++;
- ma=max(ma,ans);
- return;
- }
- for(int i=now+;i<=m;i++)
- {
- dfs(cnt-,i,q);
- }
- }
- int main()
- {
- int i,j,k,t;
- scanf("%d%d%d",&n,&m,&k);
- rep(i,,n){
- scanf("%d",&j);
- while(j--)scanf("%d",&t),a[i][t]=;
- }
- if(m==k)return *printf("%d\n",n);
- rep(i,,k+)dfs(m-k,i,p);
- printf("%d\n",ma);
- //system ("pause");
- return ;
- }
细菌(disease)的更多相关文章
- 细菌(disease) (位运算)(状态压缩)
细菌(disease) 时间限制: 1 Sec 内存限制: 64 MB提交: 9 解决: 5[提交][状态][讨论版] 题目描述 近期,农场出现了D(1≤D≤15)种细菌.John要从他的N(1≤ ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- OpenJudge计算概论-细菌的战争
/*====================================================================== 细菌的战争 总时间限制: 1000ms 内存限制: 6 ...
- POJ C程序设计进阶 编程题#5:细菌分组实验
编程题#5:细菌实验分组 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 有 ...
- BZOJ 1688: Disease Manangement (子集枚举)
Disease Manangement Q - 枚举子集 Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d &a ...
- 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 ...
- 2712:细菌繁殖-poj
2712:细菌繁殖 总时间限制: 1000ms 内存限制: 65536kB 描述 一种细菌的繁殖速度是每天成倍增长.例如:第一天有10个,第二天就变成20个,第三天变成40个,第四天变成80个,… ...
- 统计细菌基因组ORF
提取细菌基因组ORF思路: 1.通过FNA文件得到细菌基因组序列 2.分正负链和三个相位共6种情况统计ORF 3.写入文件 转载请保留出处! 统计细菌基因组ORF 贴上Python代码(版本:3.6) ...
随机推荐
- git日志--log
1. 查找改动某个文件所有的日志 git log --pretty=oneline somefile.java git log --oneline somefile.java git log --pr ...
- Python识别网站验证码
http://drops.wooyun.org/tips/6313 Python识别网站验证码 Manning · 2015/05/28 10:57 0x00 识别涉及技术 验证码识别涉及很多方面的内 ...
- MC 在1分钟图拿出5分钟,15分钟,30分钟,1小时的K线
using System; using System.Drawing; using System.Linq; using System.Collections; namespace PowerLang ...
- mac中使用终端生成RSA私钥和公钥文件
1.打开终端输入:cd Desktop/ //进入桌面 2.OpenSSL //打开 OpenSSL 3.生成私钥pem, 执行命令 genrsa -out rsa_private_ke ...
- js截取文件名
str = 'C:\fakepath\ll.doc'; str.substring(str.lastIndexOf("\\")+1,str.lastIndexOf(".& ...
- Myeclipse 创建 Web Maven项目
1.创建Web项目 添加Maven支持 2.pom.xml 报如下错误: 解决办法: pom.xml里面添加依赖: <dependency> <groupId>com.thou ...
- WPF之DataGrid的LoadingRow事件
利用DataGrid的LoadingRow事件,可以进行设置DataGrid的DataGridRow的属性(例如样式:背景色.前景色:是否可修改数据) 实例代码如下: private void Dat ...
- Cookie 的设置和获取
获取:var userName = getCookieValue("userName"); 设置:setCookie("userName",equpid,24, ...
- Animals and Puzzle
Animals and Puzzle time limit per test 5 seconds memory limit per test 512 megabytes input standard ...
- Hibernate 系列教程9-自关联
自关联:本质还是原来双向一对多,原来要配置两个类,现在全部都配置在一个类里面 Employee public class Employee { private Long id; private Str ...