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

来源:互联网 发布:编辑排版软件 编辑:程序博客网 时间:2024/05/08 23:04

人见人爱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 73 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;}




0 0