求补集的交集
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 }