刷水题。
http://acm.hdu.edu.cn/showproblem.php?pid=1412
给你两个集合,要求{A} + {B}.
注:同一个集合中不会有两个相同的元素.
注:同一个集合中不会有两个相同的元素.
Input
每组输入数据分为三行,第一行有两个数字n,m(0<n,m<=10000),分别表示集合A和集合B的元素个数.后两行分别表示集合A和集合B.每个元素为不超出int范围的整数,每个元素之间有一个空格隔开.
Output
针对每组数据输出一行数据,表示合并后的集合,要求从小到大输出,每个元素之间有一个空格隔开.
求两个集合的和。
我用的是vector,后来感觉应该用set的。
就当熟悉stl的了。
#include <stdio.h>
#include <algorithm>
#include <set>
using namespace std;
int main()
{
int first ,last;
int n;
while(scanf("%d %d",&first,&last)!=EOF)
{
set<int> nset;
for(int i = 0 ; i < first+last ; ++i)
{
scanf("%d",&n);
nset.insert(n);
}
set<int>::iterator iter = nset.begin();
set<int>::iterator tmp = iter;
for(; ++tmp != nset.end(); ++iter)
{
printf("%d ",*iter);
}
printf("%d\n",*iter);
}
return 0;
}
vector版
1 #include <stdio.h>
2 #include <algorithm>
3 #include <vector>
4 using namespace std;
5 int main()
6 {
7 int first ,last;
8 int n;
9 while(scanf("%d %d",&first,&last)!=EOF)
10 {
11 vector <int> firstvect(0,first);
12 vector <int> lastvect(0,last);
13 for(int i = 0; i < first; ++i)
14 {
15 scanf("%d",&n);
16 firstvect.push_back(n);
17 }
18 for(int i = 0; i < last; ++i)
19 {
20 scanf("%d",&n);
21 lastvect.push_back(n);
22 }
23 std::sort(firstvect.begin(),firstvect.end());
24 std::sort(lastvect.begin(),lastvect.end());
25
26 vector<int>::iterator firstiter = firstvect.begin();
27 vector<int>::iterator seconditer = lastvect.begin();
28 while((firstiter != firstvect.end())&&(seconditer !=lastvect.end()))
29 {
30 if(*firstiter < *seconditer)
31 printf("%d ",*firstiter++);
32 else {
33 if(*firstiter == *seconditer)
34 ++firstiter;
35 printf("%d ",*seconditer++);
36 }
37 }
38 while(firstiter != firstvect.end())
39 {
40 printf("%d ",*firstiter++);
41 }
42 while(seconditer !=lastvect.end())
43 {
44 printf("%d ",*seconditer++);
45 }
46 printf("\n");
47 }
48 }
vector提示表示错误。应该是没到最后一个输出的时候,多了一个空格。
要解决的比较麻烦,于是放弃。思想是最重要的。