能否取胜?找不同的类似题

题目描述 :


有n名选手会进行m次比赛,每次比赛不会出现平局的情况,只会有一个胜者。
在每次比赛完成之后,我们视胜者选手的实力比败者选手的实力强,如果出现选手
A打败选手B,选手B打败选手C,选手C打败选手A,则视为他们的实力全部相同。

若该赛季最终冠军是属于实力最强者,请问依照现在已有的比赛结果,
最多有多少个选手可能获得冠军(如果已知两个人的实力一样强,那么他们两个人都不能获得冠军)。

输入描述:

第一行输入两个正整数n,m,其中:n<=10^5,m≤10^5

接下来m行,每行两个正整数a与b,代表选手a战胜了选手b,满足:a <=n ,b≤n

输出描述:

输出最多有多少名选手最终可能获得冠军。

题解:

利用C++的STL中的set集合:将输的人所代表的号码添加到set的集合中,此题的可以解读为----只要一个人在比赛中输一次,那这个人就不可能成为冠军,又因为set集合中只会添加不重复的数字,因此到最后set集合中记录的是输家的号码,也是输家的人数,因此胜者就是总数n减去set集合的长度;

代码:

#include<bits/stdc++.h>
#include<set>
using namespace std;

int main()
{
    int n, m, a, b;
    set <int> q;   // 声明set集合,类型为整型,名称为q
    cin>>n>>m;
    while(m--)
    {
        cin>>a>>b;   // 定义第一个人是赢家
        q.insert(b);
    }
    cout<<(n - q.size())<<endl;   // 冠军的数量
    return 0;   
}

结语:

好久没有更新博客了,更新一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值