时间限制: 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
****************************************************************/