JZOJ 1284. 病毒

题目

Description

  D(1<=D<=15)种病毒正袭击着牧场里的奶牛,这给牧场主约翰造成了极大的麻烦,因为按照卫生检疫条例的规定:如果牛奶中的病毒超过K(1<=K<=D)种则不允许被销售,约翰的牧场里共有N(1<=N<=1,000)头奶牛,每头奶牛都带有若干种病毒,约翰挤出的牛奶是混放在一起的,要求约翰最多可以挤多少头奶牛的牛奶,使得混放在一起的牛奶不包含超过K种的病毒。
 

Input

  输入文件的第一行有三个用空格隔开的整数N,D,K,接下来的N行每行表示一头奶牛的病毒列表,每行的第一个数d_i(0<=d_i<=D)表示该头奶牛共携带了d_i种病毒,紧接着的d_i个整数表示该头奶牛共携带的每一种病毒的编号,相邻两数之间用空格隔开。

Output

  输出文件仅有一行包含一个整数,表示约翰最多可以挤多少头奶牛的牛奶,使得混放在一起的牛奶不包含超过K种的病毒。
 

Sample Input

6 3 2
0
1 1
1 2
1 3
2 2 1
2 2 1

Sample Output

5
 

Data Constraint

 
 

Hint

【样例说明】
  约翰可以挤编号为1,2,3,5,6的奶牛的牛奶,牛奶中只含两种病毒(#1和#2),病毒种数不大于K(2)。

分析

  • 状压一下快一点

代码

 1 #include<iostream>
 2 #include<vector>
 3 using namespace std;
 4 long long v[1010];
 5 long long f[1010];
 6 int t[500000];
 7 void take(int n)    
 8 {
 9      for (int i=0;i<=(1<<n);i++)
10      {
11          int ii=i;
12          while (ii)
13          {
14              t[i]++;
15              ii-=(ii&(-ii));     
16          }
17      }
18  }
19 int main ()
20 {
21     int n,d,k;
22     cin>>n>>d>>k;
23     for (int i=1,x;i<=n;i++)
24     {
25         cin>>x;
26         for (int j=1,a;j<=x;j++)
27         {
28             cin>>a;
29             v[i]=v[i]|(1<<(a-1));
30         }
31     }
32     take(d);
33     int sum,ans=-10000;
34     for (int i=0;i<=(1<<d);i++)
35     {
36         sum=0;
37         if (t[i]>k) continue;
38         for (int j=1;j<=n;j++)
39         {
40             if ((v[j]&i)==v[j])
41               sum++;
42         }
43         ans=max(ans,sum);
44     }
45     cout<<ans;
46 }

猜你喜欢

转载自www.cnblogs.com/zjzjzj/p/10542633.html