用二进制压缩表示每一门科目有多少班级要考
之后枚举需要靠的科目,用二进制来控制一天之内能考的不冲突的科目
值得一提的是,虽然这样对于每一天可能并不是最佳利用的,但是答案确是最优的
因为我们保证了最后的结果是不互相冲突的,如果日子能够压缩,那么其实代表某一天的科目能放到其他天,但是这样是不存在的,否则我们在之前就能判断。
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; int a[N]; int b[N]; int vis[N]; int main() { int t; cin>>t; while(t--){ int n,q; memset(vis,0,sizeof vis); memset(a,0,sizeof a); cin>>n>>q; int i; int tmp=1; for(i=1;i<=n;i++){ int m; cin>>m; for(int j=1;j<=m;j++){ int p; cin>>p; a[p]+=tmp; } tmp*=2; } int ans=0; for(i=1;i<25;i++){ if(!vis[i]&&a[i]){ ans++; int x=a[i]; for(int j=i+1;j<25;j++){ if(!vis[j]&&a[j]){ if((x&a[j])==0){ x+=a[j]; vis[j]=1; } } } } } if(ans>q){ cout<<"NO"<<endl; } else{ cout<<"YES"<<endl; } } }