ALGO-10_蓝桥杯_算法训练_集合运算(排序)

问题描述
  给出两个整数集合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
样例输入
4
1 2 3 4
3
5 6 7
样例输出
1 2 3 4 5 6 7
1 2 3 4

 

 记:

一开始想用桶排序,结果发现在后面的测试数据中,既有大数据,也有负数

故改为正常数组存储,排序,但仍旧加入桶排序中的加点,便于输出题目所要的

 

AC代码:

  1 #include <stdio.h>
  2 #define LEN 2500 
  3 
  4 int n,m;
  5 long long arr[LEN][2] = {0};/*0->存储数据,1->存储加点*/
  6 
  7 void sort_q(int x,int y,long long tmp[LEN][2])
  8 {
  9     int i = x , j = y;
 10     long long k[2];
 11     k[0] = tmp[x][0];
 12     k[1] = tmp[x][1];
 13     if (i < j)
 14     {
 15         while (i < j)
 16         {
 17             while (i < j && k[0] < tmp[j][0])
 18                 j --;
 19             if (i < j)
 20             {
 21                 tmp[i][0] = tmp[j][0];
 22                 tmp[i][1] = tmp[j][1];
 23                 i ++;
 24             }
 25             while (i < j && k[0] > tmp[i][0])
 26                 i ++;
 27             if (i < j)
 28             {
 29                 tmp[j][0] = tmp[i][0];
 30                 tmp[j][1] = tmp[i][1];
 31                 j --;
 32             }
 33         }
 34         tmp[i][0] = k[0];
 35         tmp[i][1] = k[1];
 36         sort_q(x,i-1,tmp);
 37         sort_q(i+1,y,tmp);
 38     }
 39     return ;
 40 }
 41 
 42 void init(void)
 43 {
 44     int flag;    
 45     int i,j;
 46     long long k;
 47     
 48     scanf("%d",&n);
 49     for (i = 1 ; i <= n ; i ++)
 50     {
 51         scanf("%lld",&k);
 52         arr[i][0] = k;
 53         arr[i][1] += 1;
 54     }
 55     
 56     scanf("%d",&m);
 57     for (i = n+1 ; i <= n+m ; i ++)
 58     {
 59         scanf("%lld",&k);
 60         flag = 1;
 61         for (j = 1 ; j <= n ; j ++)
 62         {
 63             if (arr[j][0] == k)
 64             {                
 65                 arr[j][1] += 2;
 66                 flag = 0;
 67                 break;
 68             }
 69         }
 70         if (flag)
 71         {
 72             arr[i][0] = k;
 73             arr[i][1] += 2;
 74         }        
 75     }
 76     sort_q(1,i,arr);    /*快排*/
 77     return ;
 78 }
 79 
 80 void print()
 81 {
 82     int i;
 83     for (i = 1 ; i <= LEN ; i ++)
 84     {
 85         if (arr[i][1] >= 3)
 86         {
 87             printf("%lld ",arr[i][0]);/*输出AB交集*/
 88         }
 89     }
 90     printf("\n");
 91     
 92     for (i = 1 ; i <= LEN ; i ++)
 93     {
 94         if (arr[i][1] != 0)
 95         {
 96             printf("%lld ",arr[i][0]);/*输出AB并集*/
 97         }
 98     }
 99     printf("\n");
100     
101     for (i = 1 ; i <= LEN ; i ++)
102     {
103         if (arr[i][1] == 1)
104         {
105             printf("%lld ",arr[i][0]);/*输出B在A中的余集*/
106         }
107     }
108     
109     return ;
110 }
111 
112 int main(void)
113 {
114     init(); 
115     print();
116     return 0;
117 }

 

转载于:https://www.cnblogs.com/mind000761/p/8647668.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值