-
题目大意:找到party中的单身狗,并将这些单身狗升序输出
-
思路1:用map存每队情侣,因为要升序输出单身狗,用vector存参加派对的人,排除情侣,剩下的单身狗们存set里,最后直接输出set就可。
不行,超时了。
-
思路2:用map存每队情侣,用set存参加派对的人,检查s[i]的情侣是否存在,若存在就将他们两个人都删掉,最后剩下的就是单身狗。
注意:要考虑number = 00000的情况!若我将变量设置为int型,number = 00000 时,在查情侣时出现明明没有情侣,却把这个人删除的情况。把变量设置为string类型就不会出现这种问题了。
-
知识点:
- map
- set
- 访问元素:用迭代器
- 输入string型数据要用cin
-
代码:
#include <iostream> #include <string> #include <map> #include <set> using namespace std; int main(){ int n, m; string c1, c2, people; cin >> n; map<string, string> couples; set<string> singles; for(int i = 0; i < n; i++){ cin >> c1 >> c2; couples[c1] = c2; couples[c2] = c1; } cin >> m; for(int i = 0; i < m; i++){ cin >> people; singles.insert(people); } auto it = singles.begin(); while(it != singles.end()){ if(singles.find(couples[*it]) != singles.end()){ // 有一对情侣就将他们删除 singles.erase(*(singles.find(couples[*it]))); // 先删除这个人的情侣,再删除这个人 singles.erase(*it); it = singles.begin(); // 因为删除后set变了,该从头遍历set } else it++; } printf("%d\n", singles.size()); for(auto i = singles.begin(); i != singles.end(); i++){ if(i != singles.begin()) printf(" "); printf("%s", (*i).c_str()); } return 0; }
-
总结:
-
map
-
set
-
访问元素:用迭代器
-
找特殊元素:
#include <iostream> #include <set> using namespace std; int main(){ set<int> s = {0, 3, 1, -2, 10}; auto pos = s.find(-2); // 先找这个元素的位置,返回一个迭代器 cout << *pos; // 取值,输出 return 0; }
-
-
输入string型数据要用
cin
-
删除情侣后,记得重新定义迭代器的位置,因为set已经变了。
-
【PAT】1121 Damn Single (25 分)
最新推荐文章于 2021-08-16 11:55:46 发布