百炼 4088 集合运算

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值