4088:集合运算
总时间限制: 3000ms
单个测试点时间限制: 1000ms
内存限制: 65536kB
描述
设 A = {a1, a2, … , an}, B = {b1, b2, … , bm} 是非负整数集合,其中m = O(logn)。
设计算法计算集合 C = (A − B) ∪ (B − A)。
输入
输入文件包含2行。
第1行的第一个数为n,表示A集合的大小,接下来跟有A
集合中的包含的n个非负整数。
第2行的第一个数为m,表示B集合的大小,接下来跟有B
集合中的包含的m个非负整数。
两个集合中的数按照从小到大的顺序给出,n <= 106
输出
输出文件包含1行,表示计算出的C集合中所包含的整
数。
请将这些整数按照从小到大的顺序排序。
样例输入
8 1 3 5 6 8 10 12 30
3 1 3 7
样例输出
5 6 7 8 10 12 30
这道题被划分在检索的范畴,其实是一道很简单的模拟题.根据题意,只要删去 A 和 B 中相同的元素即为所求.由于 A 和 B 是按递增顺序给出的,所以这道题完全彻底就是一道水题……只要用两个下标在 A 和 B 中前进,碰到相同的就跳过,否则输出小的那个,并将小的那个下标前进一格.稍微注意一下结束的边界条件即可.
内存: 41304kB
时间: 2074ms
语言: G++
#include <iostream>
#include <cstdio>
using namespace std;
int n, m;
int A[1000100], B[1000100];
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&A[i]);
scanf("%d",&m);
for(int i=0;i<m;i++)
scanf("%d",&B[i]);
int a = 0, b = 0;
while(1)
{
if(a<n && b<m)
{
if(A[a] < B[b])
{
printf("%d ",A[a]);
a++;
}
else if(A[a] == B[b])
{
a++; b++;
}
else if(A[a] > B[b])
{
printf("%d ",B[b]);
b++;
}
}
else if(a<n && b>=m)
{
for(int i=a;i<n;i++)
printf("%d ",A[i]);
break;
}
else if(a>=n && b<m)
{
for(int i=b;i<m;i++)
printf("%d ",B[i]);
break;
}
else
break;
}
return 0;
}