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 }
PTA乙级 (1065 单身狗 (25分)(map,set.find(),vector))
原文:https://www.cnblogs.com/jianqiao123/p/12215405.html