#include <iostream>
#include <bits/stdc++.h>
using namespace std;
/*
这里有一个关键点:
使用集合,我们可以获得选手集合 和 失败者集合
如果二者相等说明所有人都失败过 否则一定有一个人没失败过为最终的winner
*/
int main()
{
int num;
while (cin >> num)
{
if (num == 0)
continue;
set<string> all;
set<string> loser;
while (num--){
string player1;
string player2;
cin >> player1 >> player2;
all.insert(player1);
all.insert(player2);
loser.insert(player2);
}
if ((all.size() - loser.size()) == 1)
{
cout << "Yes" << endl;
/*
测试winner
string winner;
for (auto it = loser.begin(); it != loser.end(); it++)
all.erase(*it);
*/
}
else
cout << "No" << endl;
}
return 0;
}
关键点:巧妙点在于
使用集合,我们可以获得选手集合 和 失败者集合
如果二者相等说明所有人都失败过 否则一定有一个人没失败过为最终的winner,大家可能会疑惑,为什么不能有两个胜利者,这是因为比赛的制度是两两制,每两个人都要打比赛,所以一定会分出胜负,或者没有赢家。
我还使用了一个错误的办法 只使用winner集合 每次插入 并删除loser 这样的错误在于 后面有新的winner我还是会插入 当时这个winner之前已经被打败 所以很大概率都是YES ,但是我有一个心的办法 比题目麻烦 就是 winner-loser集合 观察winner是否为isempty用到的新知识是: .find() 如果没找到会返回.end()迭代器,大家可以自己尝试这个鸡肋的做法;