这个题原来没有思路,感觉较难,想着得建树,后来在讨论区看到神贴,用set水过,看了一下,才想到方法,其实这个不用set的巧妙之处是 运用了set 相同的元素只存储一个的特性,建立两个容器,好啦,大家一看代码便知思路,我暴怒废话啦
#include<iostream> #include<set> #include<string> #include<algorithm> //这个不能少,用到比较时旧的添上 using namespace std; int main() { int n; string str1,str2; set<string>a,b; while(scanf("%d",&n),n) { while(n--) { cin>>str1>>str2; a.insert(str1); b.insert(str2); } set<string>::iterator i; for(i=b.begin();i!=b.end();i++) { if(find(a.begin(),a.end(),*i)!=a.end()) a.erase(*find(a.begin(),a.end(),*i)); } if(a.size()==1) cout<<"Yes"<<endl; else cout<<"No"<<endl; a.clear(); b.clear(); } return 0; }
set的一下简单操作:
begin() 返回指向第一个元素的迭代器
clear() 清除所有元素
count() 返回某个值元素的个数
empty() 如果集合为空,返回true(真)
end() 返回指向最后一个元素之后的迭代器,不是最后一个元素
equal_range() 返回集合中与给定值相等的上下限的两个迭代器
erase() 删除集合中的元素
find() 返回一个指向被查找到元素的迭代器
get_allocator() 返回集合的分配器
insert() 在集合中插入元素
lower_bound() 返回指向大于(或等于)某值的第一个元素的迭代器
key_comp() 返回一个用于元素间值比较的函数
max_size() 返回集合能容纳的元素的最大限值
rbegin() 返回指向集合中最后一个元素的反向迭代器
rend() 返回指向集合中第一个元素的反向迭代器
size() 集合中元素的数目
swap() 交换两个集合变量
upper_bound() 返回大于某个值元素的迭代器
value_comp() 返回一个用于比较元素间的值的函数
StL用多了,大家也知道,其实常用的操作没几个,想本题里面的find就是常用之一,记住即可!