HDU-2094

#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()迭代器,大家可以自己尝试这个鸡肋的做法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值