集合的差(STL set的某些用法)

时间限制: 1 Sec 内存限制: 128 MB
[提交] [状态]
题目描述
有两个数列A和B,那些在A中出现但不在B中出现的数就称为集合A和集合B的差:A-B。例如:A={1 ,4, 5, 2, 6} ,B={ 5,3,2,7} , 那么A-B = {1,4,6}。
现在给你2个集合A和B,求A-B有多少个数。

输入
第一行2个整数na和nb,表示集合A和集合B各有多少个整数,1<=na,nb<=10000。
第二行na个不同的正整数,表示集合A里的数,每个正整数不超过10000。
第二行nb个不同的正整数,表示集合B里的数,每个正整数不超过10000。

输出
一个整数,A-B里有多少数。
样例输入 Copy

5 4 
5 2 4 8 7 
3 7 6 2

样例输出 Copy

3

提示
A-B={5,4,8 }
即求集合A与B的差的元素个数,先求A与B的交的元素个数,然后再用集合A的元素个数减去相同的元素个数。
本题数据1e4,暴力勉强能过,如果数据量再大,我们可以利用STL中的set。
此题运用了set的以下几个特性:
1.set的插入操作时间复杂度为O(logN)
2.set中元素唯一、有序,对应着集合的确定性
3.set的count函数可以用来判断某一元素是否存在于原来的set中,如果存在返回1,不存在返回0

#include<cstdio>
#include<set>
using namespace std;
set<int>aaa;
int main()
{
    
    
    int na,nb,a,b,i,cnt=0;
    scanf("%d %d",&na,&nb);
    for(i=1;i<=na;i++)
    {
    
    
        scanf("%d",&a);
        aaa.insert(a);
    }
    for(i=1;i<=nb;i++)
    {
    
    
        scanf("%d",&b);
        if(aaa.count(b))cnt++;
    }
    printf("%d",na-cnt);
    return 0;
}
/**************************************************************
    Language: C++
    Result: 正确
    Time:19 ms
    Memory:2340 kb
****************************************************************/
#include<stdio.h>
int a[10005];
int b[10005];
int main()
{
    
    
    int na,nb,i,j,cnt=0;
    scanf("%d %d",&na,&nb);
    for(i=0;i<=na-1;i++)
    {
    
    
        scanf("%d",&a[i]);
    }
    for(i=0;i<=nb-1;i++)
    {
    
    
        scanf("%d",&b[i]);
    }
    for(i=0;i<=na-1;i++)
    {
    
    
        for(j=0;j<=nb-1;j++)
        {
    
    
            if(a[i]==b[j])cnt++;
        }
    }
    printf("%d",na-cnt);
    return 0;
}
/**************************************************************
    Language: C++
    Result: 正确
    Time:203 ms
    Memory:1196 kb
****************************************************************/

猜你喜欢

转载自blog.csdn.net/upc122/article/details/105282038