PTA乙级 (1065 单身狗 (25分)(map,set.find(),vector))

1065 单身狗 (25分)

https://pintia.cn/problem-sets/994805260223102976/problems/994805266942377984

解题思路:一开始只使用map<int, int> comp和vector<int> vec;comp用来存储每一对数字,vec用来存储查找出来的单身狗,查找单身狗时用了双重for循环直接一个个用map查询是否配对结果测试点三,四超时;后来改成使用set.find()查找:

1.将所有情侣用一个set存起来,一对情侣再分别做两个映射,方便查询11111-->22222,22222-->11111
2.客人用一个数组存起来,再用set存一遍方便查询,接下来就遍历客人,判断是否落单
3.set是一颗二叉树,这里使用了set的find函数

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <string>
 6 #include <cstdio>
 7 #include <map>
 8 #include <vector>
 9 #include <set>
10 using namespace std;
11 int main()
12 {
13     ios::sync_with_stdio(false);   
14     cin.tie(0);
15     map<int, int> comp;
16     set<int> st1,st2;
17     vector<int> vec;
18     int n,m,temp1,temp2;
19     int s1[10002];
20     cin>>n;
21     for(int i=0;i<n;i++)
22     {
23         cin>>temp1>>temp2;
24         st1.insert(temp1);
25         st1.insert(temp2);
26         comp[temp1]=temp2;
27         comp[temp2]=temp1;
28     }
29     cin>>m;
30     for(int i=0;i<m;i++) 
31     {cin>>s1[i];st2.insert(s1[i]);}
32     for(int i=0;i<m;i++)
33     {
34         if(st1.find(s1[i])!=st1.end())
35         {
36             if(st2.find(comp[s1[i]])!=st2.end());
37             else vec.push_back(s1[i]);
38         }
39         else vec.push_back(s1[i]);
40     }
41     sort(vec.begin(),vec.end());
42     cout<<vec.size()<<endl;
43     for(int i=0;i<vec.size();i++)
44     {
45         if(i==0) printf("%05d",vec[i]);
46         else printf(" %05d",vec[i]);
47     }
48     return 0;
49 }

猜你喜欢

转载自www.cnblogs.com/jianqiao123/p/12215405.html