蓝桥杯 算法训练 集合运算-(注释详解)

7 篇文章 0 订阅
5 篇文章 1 订阅

题目 1606: [蓝桥杯][算法训练VIP]集合运算

时间限制: 1Sec 内存限制: 128MB 提交: 516 解决: 228

                题目描述
                给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。 

输入
第一行为一个整数n,表示集合A中的元素个数。

第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。

第三行为一个整数m,表示集合B中的元素个数。

第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。

集合中的所有元素均为int范围内的整数,n、m< =1000。

                输出
                第一行按从小到大的顺序输出A、B交集中的所有元素。 

第二行按从小到大的顺序输出A、B并集中的所有元素。

第三行按从小到大的顺序输出B在A中的余集中的所有元素。

                样例输入

5
1 2 3 4 5
5
2 4 6 8 10

                样例输出

2 4
1 2 3 4 5 6 8 10
1 3 5
这题代码量有点大

#include<iostream>
#include<algorithm>
#define MAX 10000
using namespace std;

int dfs(int *str,int len,int a)//判断某给元素是否在当前集合 
{
	for(int i=0;i<len;i++)
	{
		if(str[i]==a)
		{
			return 1;
		}
	}
   return 0;	
}


int main()
{
	int sta[MAX];//集合a 
	int stb[MAX];//集合b 
	int n,m,i,j;
	cin>>n;
	for(i=0;i<n;i++)
	{
		scanf("%d",&sta[i]);
	}
	cin>>m;
	for(j=0;j<m;j++)
    {
    	scanf("%d",&stb[j]);
	 }
	 
	 int jiao[MAX];//交集 
	 int bing[MAX];//并集 
	 int yu[MAX];//b在a的余 
	 int cj=0,cb=0,cy=0;//他们的个数 
	  
	 for(i=0;i<m;i++)
	 {
	 	bing[cb++]=stb[i];//先将b的所有元素放到并集数组里面	 	
	 }
	 
	 for(i=0;i<n;i++)
	 {
	 	int xb=0;
	 	xb=dfs(stb,m,sta[i]);//查询当前元素在b集合里是否有 
	     if(xb==1)
		 {
		 	jiao[cj++]=sta[i];//有的话就是交际 
			 }
		  else{//这里主要偷懒少写一给if语句 
		  	bing[cb++]=sta[i];//刚好没有的可以反正并集里  
		  }	
	 }
	 
	 for(i=0;i<n;i++)
	 {
	 	int xb=0;
	 	xb=dfs(jiao,cj,sta[i]);//查询交集在a的余 
	 	if(xb==0)
	 	{
	 		yu[cy++]=sta[i];//存入数组 
		 }
	 }
   //使用sort快排  
   sort(jiao,jiao+cj,less<int>());//升序排序 
   sort(bing,bing+cb,less<int>());
   sort(yu,yu+cy,less<int>());
   
   for(i=0;i<cj;i++)
   {
   	   cout<<jiao[i]<<' ';//依次输出 
   }
   cout<<endl;
   
   for(i=0;i<cb;i++)
   {
   	  cout<<bing[i]<<' ';
   }
   cout<<endl;
   
   for(i=0;i<cy;i++)
   {
   	   cout<<yu[i]<<' ';
   }
   cout<<endl;
   
   return 0;
}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值