题目:Frequent Subsets Problem
题意:U={1, 2,…,N},m个U的子集S1,S2,…,Sm,一个double型的a。
定义Frequent Subset为在S1,S2,…,Sm中包含次数>=a*m的一个集合,问Frequent Subset存在多少种?
思路:比赛时头铁,想了一种dfs的方法,WA了。正解应该是状压,然后枚举集合。枚举答案的复杂度是1e6,枚举Si的复杂度是m,最差复杂度是5e7。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<cmath>
#include<map>
#include<set>
#include<cstdlib>
#define mem(a,b) memset(a,b,sizeof(a))
#define INF 0x7fffffff
typedef long long ll;
using namespace std;
const int maxm = 55;
int sset[maxm];
int n,m;
double a;
void solve(int least){
int ans = 0;
for(int i = 1; i < (1 << 20); i++){
int cnt = 0;
for(int j = 0; j < m; j++){
if((i&sset[j]) == i){
cnt++;
}
}
if(cnt >= least){
ans++;
}
}
printf("%d\n",ans);
}
int main(){
int num;
char ch;
m = 0;
scanf("%d%lf",&n,&a);
while(scanf("%d%c",&num,&ch)!=EOF){
sset[m] += (1<<(num-1));
if(ch == '\n') m++;
}
int least = ceil(m*a);
solve(least);
return 0;
}