您的位置:首页 > 其它

集合

2016-07-10 14:38 281 查看
【问题描述】

  给定两个集合A、B,我们希望求出A、B之间的关系:

  A是B的一个真子集,输出“A is a proper subset of B”

  B是A的一个真子集,输出“B is a proper subset of A”

  A和B是同一个集合,输出“A equals B”

  A和B的交集为空,输出“A and B are disjoint”

  上述情况都不是,输出“I’m confused!”

【输入格式】

  有两行,分别表示两个集合,每行的第一个整数为这个集合的元素个数(至少一个),然后紧跟着这个集合的元素(均为不同的正整数)

  

【输出格式】

  只有一行,就是A、B的关系。

【输入样例】

【样例1】

 2 55 27

 2 55 27

【样例2】

 3 9 24 1995

 2 9 24

【样例3】

 3 1 2 3

 4 1 2 3 4

【样例4】

 3 1 2 3

 3 4 5 6

【样例5】

 2 1 2

 2 2 3

【输出样例】

【样例1】

 A equals B

【样例2】

 B is a proper subset of A

【样例3】

 A is a proper subset of B

【样例4】

 A and B are disjoint

【样例5】

 I’m confused!

【数据范围】

集合内的任一元素x满足1 ≤ x ≤ 10^9,并且每个集合的元素个数不大于10^5。

#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
#define oo 100005
using namespace std;
int n1,n2,a[oo],b[oo];
bool tong=true,jiaojiweikong=true;
bool ainb=true,bina=true;
void check1()
{
for(int i=1;i<=n1;i++)
{
if(!tong&&!jiaojiweikong) break;
bool ok=binary_search(a+1,a+n1+1,b[i]);
if(ok) jiaojiweikong=false;
if(!ok) tong=ainb=bina=false;
}
}
void check2()
{
int n=min(n1,n2);
if(n1<n2)
{
bina=false;
for(int i=1;i<=n;i++)
{
if(!ainb&&!jiaojiweikong) break;
bool ok=binary_search(b+1,b+n2+1,a[i]);
if(!ok) ainb=false;
if(ok) jiaojiweikong=false;
}
}
else
{
ainb=false;
for(int i=1;i<=n;i++)
{
if(!bina&&!jiaojiweikong) break;
bool ok=binary_search(a+1,a+n1+1,b[i]);
if(!ok) bina=false;
if(ok) jiaojiweikong=false;
}
}
}

int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n1);
for(int i=1;i<=n1;i++)
scanf("%d",&a[i]);
sort(a+1,a+n1+1);
scanf("%d",&n2);
for(int i=1;i<=n2;i++)
scanf("%d",&b[i]);
sort(b+1,b+n2+1);

if(n1==n2) check1();
else check2();

if(n1==n2&&tong) printf("A equals B");
else if(jiaojiweikong) printf("A and B are disjoint");
else if(ainb) printf("A is a proper subset of B");
else if(bina) printf("B is a proper subset of A");
else printf("I'm confused!");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: