{A} + {B} 问题

一个集合相加问题

点击打开链接

Problem Description
给你两个集合,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素.

Input
每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.

Output
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.
 
Sample Input
  
  
1 2 1 2 3 1 2 1 1 2

Sample Output
  
  
1 2 3 1 2


最开始的思路是,将两个集合的元素合并起来,然后剔除掉相同的数据,然后再排序进行输出,便有了代码1.0
#include<stdio.h>
#include<string.h>
int main()
{
	int a,b,C[20000];
	while ((scanf("%d%d",&a,&b)) != EOF)
	{		
		int i,j,t,k;
		k = a+b;
		for ( i = 0 ; i < k ; i++ )
		{
			scanf("%d",&C[i]);
		}
		int cnt = 0;
		for ( i = 0 ; i < k-1-cnt ; i++ )
		{
			for ( j = i+1 ; j < k-cnt ; j++ )
			{
				if(C[i] == C[j])
				{
					for (t = i ; t < k-1 ; t++)
					{
						C[t] = C[t+1];
					}
					cnt++;
				}
			}
		}
	
		for ( i = 0 ; i < k-1-cnt ; i++ )
		{
			for ( j = i+1 ; j < k-cnt ; j++ )
			{		
				if(C[i] > C[j])
				{
					t = C[i];
					C[i] = C[j];
					C[j] = t;
				}
			}
		}
	
		for ( i = 0 ; i < k-cnt ; i++ )
		{
			printf("%d ",C[i]);
		}
		printf("\n");
	}	
		
	return 0;
	
}

但是进行多次WA后发现并不能很好的实现把重复元素从数组中剔除这一目的,一时间解题陷入 江局僵局,后来在某人不经意的指点下,发现这个题目其实实现起来很简单,并不需要非得把重复数据剔除,因为题目只要求输出即可,那我们不把相同数据输出就行了,于是便有了下面的代码2.0

/**
 *                             _ooOoo_
 *                            o8888888o
 *                            88" . "88
 *                            (| -_- |)
 *                            O\  =  /O
 *                         ____/`---'\____
 *                       .'  \\|     |//  `.
 *                      /  \\|||  :  |||//  \
 *                     /  _||||| -:- |||||-  \
 *                     |   | \\\  -  /// |   |
 *                     | \_|  ''\---/''  |   |
 *                     \  .-\__  `-`  ___/-. /
 *                   ___`. .'  /--.--\  `. . __
 *                ."" '<  `.___\_<|>_/___.'  >'"".
 *               | | :  `- \`.;`\ _ /`;.`/ - ` : | |
 *               \  \ `-.   \_ __\ /__ _/   .-` /  /
 *          ======`-.____`-.___\_____/___.-`____.-'======
 *                             `=---='
 *          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 *                     佛祖保佑        永无BUG
 *            佛曰:
 *                   写字楼里写字间,写字间里程序员;
 *                   程序人员写程序,又拿程序换酒钱。
 *                   酒醒只在网上坐,酒醉还来网下眠;
 *                   酒醉酒醒日复日,网上网下年复年。
 *                   但愿老死电脑间,不愿鞠躬老板前;
 *                   奔驰宝马贵者趣,公交自行程序员。
 *                   别人笑我忒疯癫,我笑自己命太贱;
 *                   不见满街漂亮妹,哪个归得程序员?
*/

#include<stdio.h>
#include<string.h>
int main()
{
	int a,b,C[20000];
	while ((scanf("%d%d",&a,&b)) != EOF)
	{		
		int i,j,t,k;
		k = a+b;
		for ( i = 0 ; i < k ; i++ )
		{
			scanf("%d",&C[i]);
		}
	
		for ( i = 0 ; i < k-1 ; i++ )//这里可以直接用sort进行排序
		{
			for ( j = i+1 ; j < k ; j++ )
			{		
				if(C[i] > C[j])
				{
					t = C[i];
					C[i] = C[j];
					C[j] = t;
				}
			}
		}
		
		printf("%d",C[0]);
		for ( i = 1 ; i < k ; i++ )
		{
			if ( C[i] != C[i-1] )  //如果当前数据和前一个数据相同就不输出
				printf(" %d",C[i]);
		}
		printf("\n");
	}	
		
	return 0;
	
}

这样一来便可以轻松AC,由此看来,并不是所有题目都非要按照题面的要求来严格执行,有时候还是可以投机取巧的 大笑

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值