传送门
题目大意
给出n头牛的得病的种类情况,一共有d种病,要求找出最多有K种病的牛的数目;
思路
因为d<15,所以可以进行二进制枚举,枚举这个病存在或者不存在,1存在,0不存在,然后和每头牛进行或运算,如果或运算之后还相等,那就说明这头牛携带病毒中类小于等于当前病毒种类,那么cc++,最后取个最大值就好了。
注意
位运算优先级,卡了好久…
代码
int cow[maxn];
int check(int num){
int count=0;
while(num){
num=num&(num-1);
count++;
}
return count;
}
int main(){
int n,d,k;
cin>>n>>d>>k;
memset(cow,0,sizeof cow);
for(int i=1;i<=n;i++){
int t;
cin>>t;
for(int j=1;j<=t;j++){
int x;
cin>>x;
x--;
cow[i]=cow[i]|(1<<x);
}
}
int ans=0;
for(int i=1;i<=(1<<d);i++){
int cc=0;
if(check(i)>k)continue;
for(int j=1;j<=n;j++){
if((i|cow[j])==i){
cc++;
}
}
ans=max(ans,cc);
}
printf("%d\n",ans);
}