BestCoder12 1001.So easy(hdu 5058) 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5058

(格式有点问题,为了方便阅读~~~整个复制下来吧)

 

题目意思:给出两个长度都为 n 的集合你,问这两个集合是否相等。

     其实思路非常容易想到,就是去重后判断嘛~~~我用到了set 来做。不过有个小细节!!!

     

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <set>
 6 using namespace std;
 7 
 8 set<int> a, b;
 9 set<int>::iterator pa, pb;
10 
11 int main()
12 {
13     #ifndef ONLINE_JUDGE
14         freopen("in.txt", "r", stdin);
15     #endif
16 
17     int n, in;
18     while (scanf("%d", &n) != EOF)
19     {
20         a.clear();
21         b.clear();
22         for (int i = 0; i < n; i++)
23         {
24             scanf("%d", &in);
25             a.insert(in);
26         }
27         for (int i = 0; i < n; i++)
28         {
29             scanf("%d", &in);
30             b.insert(in);
31         }
32         
33         bool flag = true;
34         pb = b.begin();
35         for (pa = a.begin(); pa != a.end() && pb != b.end(); pa++, pb++)
36         {
37             if (*pa != *pb)
38             {
39                 flag = false;
40                 break;
41             }
42         }
43         printf("%s
", flag && pa == a.end() && pb == b.end() ? "YES" : "NO");
44     }
45     return 0;
46 }

    

    特别要注意,最后不能单纯只用 flag 来判断输入和输出!!!还需要结合 pa 和 pb 的位置来判断,即都要直到集合结尾,代表元素个数是一样的。因为有可能两个集合去重之后大小不等,而for 循环中是没有考虑到这点的!!只是单纯地以比较短的那个集合来作为基准,如果遇到 {1, 3, 5} , {1, 3, 3},它会提前跳出来并且判断结果是 YES,明显是错的嘛~~~ 

    粗心呀~~~

   另外一种解法,unique 妙用,第一次使用,留个纪念吧~~~~ 

   (unique 用之前需要先排序,而且它不是真正的删除,网上说是挪到数组后面而已)

    

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 #include <algorithm>
 6 
 7 using namespace std;
 8 
 9 const int maxn = 100 + 5;
10 int a[maxn], b[maxn];
11 
12 int main()
13 {
14     #ifndef ONLINE_JUDGE
15         freopen("in.txt", "r", stdin);
16     #endif
17 
18     int n;
19     while (scanf("%d", &n) != EOF)
20     {
21         for (int i = 0; i < n; i++)
22             scanf("%d", &a[i]);
23         for (int i = 0; i < n; i++)
24             scanf("%d", &b[i]);
25         sort(a, a+n);
26         sort(b, b+n);
27         int la = unique(a, a+n) - a;
28         int lb = unique(b, b+n) - b;
29 
30         if (la != lb)
31             printf("NO
");
32         else
33         {
34             bool flag = true;
35             for (int i = 0; i < la; i++)
36             {
37                 if (a[i] != b[i])
38                 {
39                     flag = false;
40                     break;
41                 }
42             }
43             printf("%s
", flag ? "YES" : "NO");
44         }
45     }
46     return 0;
47 }
原文地址:https://www.cnblogs.com/windysai/p/4008003.html