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