求补集的交集
Time Limit: 2000/1000ms (Java/Others)
Problem Description:
给定一个集合,然后再给出两个该集合的子集,求他们对应补集的交集。
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?" ":"
");}
15 if(!flag)cout<<"NULL"<<endl;
16 }
17 return 0;
18 }