ACM训练题

来源:互联网 发布:js身份证号计算年龄 编辑:程序博客网 时间:2024/06/05 02:43
每组输入数据占1行,每行数据的开始是2个整数n(0<=n<=100)和m(0<=m<=100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B. 每个元素为不超出int范围的整数,元素之间有一个空格隔开. 如果n=0并且m=0表示输入的结束,不做处理。#include<cstdio>#include<iostream>//冒泡排序void sort( int* array, int lenth ){int i,j;int temp;for( i=0; i<lenth-1; i++ )for( j=i+1; j<lenth; j++ ){if( array[i] > array[j] ){temp = array[j];array[j] = array[i];array[i] = temp;}}} int A[105], B[105];bool flag[105];  //A中元素是否删除的标志位int main(){int m,n;int delNum;while( scanf("%d %d",&n, &m) && (n!=0||m!=0) ){//读入集合A,并对集合A中的元素进行排序for( int i=0; i<n; i++ ){scanf("%d",A+i);flag[i] = 1;  //将A中的元素是否删除的标志初始化为全部置位1,表示该元素不需要删除}sort( A, n );//读入集合B,并对集合B中的元素进行排序for( int i=0; i<m; i++ )scanf("%d",B+i);sort( B, m );delNum = 0; //记录A中元素删除的个数//对于排序后的集合A,依次判断每个元素在集合B中是否出现(因为A和B均已排序,在集合B中比较的起始位置为上次和集合A中元素相等的元素位置的下一个坐标)int Bpos = 0;  //记录集合B中上一次和A中元素相等的元素位置的下一个坐标for( int i=0; i<n; i++ ){for( int j=Bpos; j<m; j++ )if( A[i] == B[j] )  //说明集合A中的元素在集合B中出现,那该元素应该删除,flag[i]变为0,变更集合B访问的起始位置{flag[i] = 0;delNum ++;Bpos = j+1;break;}}//输出全部删除的情况if( delNum == n ){printf("NULL\n");continue;}//输出未全部删除的情况for( int i=0; i<n; i++ ){if( flag[i] )printf( "%d ", A[i] );}printf("\n");}//system("pause");return 0;}