杭电OJ -- 2034 人见人爱A-B(c++练手的好题目)

人见人爱A-B

Problem Description 参加过上个月月赛的同学一定还记得其中的一个最简单的题目,就是{A}+{B},那个题目求的是两个集合的并集,今天我们这个A-B求的是两个集合的差,就是做集合的减法运算。(当然,大家都知道集合的定义,就是同一个集合中不会有两个相同的元素,这里还是提醒大家一下)

呵呵,很简单吧?  

Input 每组输入数据占1行,每行数据的开始是2个整数n(0<=n<=100)和m(0<=m<=100),分别表示集合A和集合B的元素个数,然后紧跟着n+m个元素,前面n个元素属于集合A,其余的属于集合B. 每个元素为不超出int范围的整数,元素之间有一个空格隔开.

如果n=0并且m=0表示输入的结束,不做处理。  

Output 针对每组数据输出一行数据,表示A-B的结果,如果结果为空集合,则输出“NULL”,否则从小到大输出结果,为了简化问题,每个元素后面跟一个空格.

 

Sample Input

3 3 1 2 3 1 4 7 3 7 2 5 8 2 3 4 5 6 7 8 0 0  

Sample Output

2 3 NULL  
不带什么含金量,纯练手的题目,做ACM的同学,并且使用C++的,真的要好好去看一看<c++标准函数库>和<stl源码剖析>这两本书,看完之后你才知道c++有多么宏伟,对了,不要重复造轮子,这道题目在stl库里面有函数可以直接用,效率什么的,至少比你自己写的要高,所谓的’在sgi stl源码面前,%99的程序员的代码都是三流水平’这句话不是白说的。话就说道这里,自己看着办吧!


网上的那些代码有些真的很幼稚,输入的数据没有顺序,要排序,为什么不直接用set呢?插入的时候就已经排好序了呀。用的是红黑树,自行去补stl源码分析。

#include <iostream>
#include <vector>
#include <set>
#include <iterator>
#include <algorithm>
using namespace std;

void output(set<int> &v)
{
	set<int>::iterator it = v.begin();
	for (; it != v.end(); ++it)
	{
		cout << *it << " ";
	}
}

int main()
{
	set<int> n_elem, m_elem, o_elem;
	int n, m;
	while(cin >> n >> m && !(n == 0 && m == 0))
	{
		//copy_n(istream_iterator<int>(cin), n, inserter(n_elem, n_elem.end()));
		//copy_n(istream_iterator<int>(cin), m, inserter(m_elem, m_elem.end()));
		int val;
		for (int i = 0; i < n; ++i)
		{
			cin >> val;
			n_elem.insert(val);
		}
		for (int i = 0; i < m; ++i)
		{
			cin >> val;
			m_elem.insert(val);
		}
	
		set_difference(n_elem.begin(), n_elem.end(),
			m_elem.begin(), m_elem.end(),
			inserter(o_elem, o_elem.end()));
		if (o_elem.size() == 0)
			cout << "NULL";
		else
		{
			//output(o_elem);
			copy(o_elem.begin(), o_elem.end(), ostream_iterator<int>(cout, " "));
		}
		cout << endl;
		n_elem.clear();
		m_elem.clear();
		o_elem.clear();
	}
	return 0;
}

    原文作者:B树
    原文地址: https://blog.csdn.net/lishuhuakai/article/details/48895207
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞