题解细菌
Posted kcn999
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了题解细菌相关的知识,希望对你有一定的参考价值。
题目描述
近期,农场出现了D(1≤D≤15)种细菌。Farmer John要从他的N(1≤N≤1000)头奶牛中尽可能多地选些产奶。但是如果选中的奶牛携带了超过K(1≤K≤D)种不同细菌,所生产的奶就不合格。请你帮助John计算出最多可以选择多少头奶牛。
输入输出格式
输入格式
第一行,三个整数,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
说明
样例说明
选择:1,2,3,5,6,这样只有1#和2#两种细菌。
题解
n <= 1000,则直接枚举奶牛显然不行。我们可以枚举细菌,然后求出当前细菌搭配下的最大可选奶牛数量即可。
#include<iostream> using namespace std; int n,d,k; int a[20];//二进制细菌 int b[20][1005];//细菌对应奶牛 int cow[1005][20];//奶牛对应细菌 int differ[1005];//二进制奶牛 int cbnum[1005];//奶牛携带细菌数量 int temp,num; int ans,bns; int main() { cin>>n>>d>>k; for(int i=1;i<=n;i++) { cin>>temp; if(!temp) bns++; cbnum[i]=temp; for(int j=1;j<=temp;j++) { cin>>cow[i][j]; for(int k=1;;k++) { if(!b[cow[i][j]][k]) { b[cow[i][j]][k]=i; break; } } } } temp=num=0; while(!a[d+1]) { if(temp<=k&&num>ans) ans=num; for(int i=1;i<=d+1;i++) { if(!a[i]) { a[i]=1; temp++; for(int j=1;;j++) { if(!b[i][j]) break; differ[b[i][j]]++; if(differ[b[i][j]]==cbnum[b[i][j]]) num++; } break; } else { a[i]=0; temp--; for(int j=1;;j++) { if(!b[i][j]) break; if(differ[b[i][j]]==cbnum[b[i][j]]) num--; differ[b[i][j]]--; } } } } cout<<ans+bns; return 0; }
以上是关于题解细菌的主要内容,如果未能解决你的问题,请参考以下文章