ACM_求补集的交集

求补集的交集

Time Limit: 2000/1000ms (Java/Others)

Problem Description:

给定一个集合,然后再给出两个该集合的子集,求他们对应补集的交集。

Input:

输入包含多组测试数据,每组数据包含一个整数N(1<=N<=10^5),表示全集的大小(从1到N)接下来输入两个集合,每个集合先输入一个数m(1<=m<=N)表示子集的大小,然后有m个数,代表子集的元素

Output:

对于每组测试,如果对应补集的交集为空,输出NULL,否则输出交集。

Sample Input:

10
3
1 3 5
4
2 3 5 1
2
1
1
1
2

Sample Output:

4 6 7 8 9 10
NULL
解题思路:水题!!!题目已经说明得很清楚了,如果两个集合的补集有交集,输出它们的交集部分,否则输出NULL。这里用一维数组来标记两个集合中的元素为假值,最后判断是真的就输出即可。水过。
AC代码:
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 bool a[100005];
 4 int main()
 5 {
 6     int n,m,x,g,k;bool flag;
 7     while(cin>>n){
 8         memset(a,true,sizeof(a));k=g=0;flag=false;
 9         for(int i=1;i<=2;++i){
10             cin>>m;g=max(g,m);
11             while(m--){cin>>x;a[x]=false;}
12         }g=n-g;//补集长度为n-两个集合中长度最大的那个
13         for(int i=1;i<=n;++i)
14             if(a[i]){k++;flag=true;cout<<i<<(k<g?" ":"\n");}
15         if(!flag)cout<<"NULL"<<endl;
16     }
17     return 0;
18 }

猜你喜欢

转载自www.cnblogs.com/acgoto/p/9016935.html