题目地址
题干
代码和解释
题意可以这样理解:一个人只要没输过就可以是冠军,如果没输过的人恰为一位,那就认他为冠军,若少于或多于一位,则判定没有冠军。所以只需要把获胜的人依次插入集合中,再把失败的依次删除,最后剩下的人数如果为1则产生冠军,否则没有冠军。
set的特点是集合中每个元素只出现一次,且为排好序的。访问元素的时间复杂度为O(logn)。元素插入和删除效率高。
本题我们使用了string类型,注意头文件#include<string>
和#include<set>
下面是本题的c++代码
#include<iostream>
#include<set>
#include<string>
using namespace std;
int main()
{
int n;
int i;
string add[1000];
string del[1000];
while(~scanf("%d",&n)&&n){
set<string> s;
for(i=0;i<n;i++){
cin>>add[i];
cin>>del[i];
}
for(i=0;i<n;i++){
s.insert(add[i]);
}
for(i=0;i<n;i++){
s.erase(del[i]);
}
if(s.size()==1) printf("Yes\n");
else printf("No\n");
}
return 0;
}
参考
- STL set的有关操作
例子 | 说明 |
---|---|
set A; | 定义 |
A.insert(item); | 把item放进set |
A.erase(item); | 删除元素item |
A.clear(); | 清空set |
A.empty(); | 判断是否为空 |
A.size(); | 返回元素个数 |
A.find(k); | 返回一个迭代器,指向键值k |
A.lower_bound(k); | 返回一个迭代器,指向键值不小于k的第一个元素 |
A.upper_bound(k); | 返回一个迭代器,指向键值大于k的第一个元素 |