宁波多校(一) C题 期末考试的安排

用二进制压缩表示每一门科目有多少班级要考

之后枚举需要靠的科目,用二进制来控制一天之内能考的不冲突的科目

值得一提的是,虽然这样对于每一天可能并不是最佳利用的,但是答案确是最优的  

因为我们保证了最后的结果是不互相冲突的,如果日子能够压缩,那么其实代表某一天的科目能放到其他天,但是这样是不存在的,否则我们在之前就能判断。   

#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;
        }
    }
}
View Code

                                                                                                                                                                        

原文地址:https://www.cnblogs.com/ctyakwf/p/13252023.html