题目:给你两个集合,判断集合关系(相等,子集,不相交,其他)。
分析:模拟。直接按照集合关系的定义判断即可。
对两个集合排序,利用类似归并排序的办法判断即可,统计以下三种数据:
1.在A中不在B中的元素个数;2.在B中不在A中的元素个数;3.即在A中又在B中的元素个数;
对以上3个值判断即可。
说明:读数据时注意格式。
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
int setA[10000];
int setB[10000];
int read( int*A, int* p )
{
*p = 0;
char temp;
if ( scanf("%d%c",&A[(*p)++],&temp) == EOF )
return 0;
while ( temp != '\n' )
scanf("%d%c",&A[(*p)++],&temp);
return 1;
}
int main()
{
int sa = 0,sb = 0;
while ( read( setA, &sa ) ) {
read( setB, &sb );
sort( setA, setA+sa );
sort( setB, setB+sb );
setA[sa] = setB[sb-1]+1;
setB[sb] = setA[sa-1]+1;
int flag1 = 0,flag2 = 0,flag3 = 0;
int move1 = 0,move2 = 0;
while ( move1 < sa || move2 < sb ) {
if ( setA[move1] < setB[move2] ) {
move1 ++; flag1 ++;
}else if ( setA[move1] > setB[move2] ) {
move2 ++; flag2 ++;
}else if ( setA[move1] == setB[move2] ) {
move1 ++; move2 ++; flag3 ++;
}
}
if ( !flag3 )
printf("A and B are disjoint\n");
else if ( !flag1 && !flag2 )
printf("A equals B\n");
else if ( flag1 && flag2 )
printf("I'm confused!\n");
else if ( flag1 )
printf("B is a proper subset of A\n");
else if ( flag2 )
printf("A is a proper subset of B\n");
}
return 0;
}