自己写的HOJ2094困惑,解题和思考

首先第一个是为什么题里给我input例子里写三个选手,但是给的有向边却一共喊有四个元素啊

看了好多解题都写着数量是3然后理所当然接四个名字

我人都傻了,是我漏了什么常识不知道吗???

咱也不知道咱也不敢问,就这样吧可能以后什么时候就想出来漏了什么呢

 

然后说说我的第二个困惑

如果win-lose大于1时候

到底是这种情况永远不会发生

还是如果发生了也不是冠军呢?

题中给的不是冠军的情况,是total==lose,构成有向有环图

会有有向有环图导致total-lose大于1吗?

想一想

total-lose什么时候才能大于1?

那就是不全进行比赛的时候

A-B C-B D-B,而ACD之间不比赛,lose=1,总=4

这个时候你不能说ACD哪个是冠军

对,之前你困惑是因为忘了是俩俩最多进行一场比赛,可以不进行

不进行比赛导致可以有total-lose>1

第一个困惑也解决了

n不是选手的个数,而是进行比赛的轮数

我大意了理解错题了

这么转过来想就明白多了好像

total是总的参赛的

lose是输过的

当没输过的有且仅有一个时候

这个就是冠军

挺简单,我理解错题想混乱了想复杂了

实现的话就是拿俩set,一个total同时录入有向边两侧

由于set集合的互异性,所以最终total中就是全体参赛成员

而另一个set是lose,记录有向边右侧的失败的

最终俩set使用.size()相减看看是否为1

清晰明了

简单描述一下结构

最外层是while,cin>>n &&n意思是有输入n且输入的n不为0

内层首先定义total和lose集合

然后进入n轮的for循环,收录输入的n对有向边,放入集合中

也就是俩集合的初始化

完成后离开for循环

下面进入if判断一下total-lose是不是1

如果是输出yes如果不是输出no

ez

写代码

#include<iostream>
#include<set>
using namespace std;
int main(){
    int n;
    while(cin>>n && n){
        set<int> T,L;
        int a,b;
        for(int i=0;i<n;i++){
            cin>>a>>b;
            T.insert(a);T.insert(b);
            L.insert(b);
        }
        if(T.size()-L.size()==1){
            cout <<"Yes";
        }else{
            cout <<"No";
        }
        T.clear();L.clear();
    }
    return 0;
}

这是第一次写出来的代码,刚刚写出来,没过,在找问题。

现在输入完不会等你下一次输入或者0,直接结束,都输出No,很明显while(cin>>n&&n)没起作用

哦哦,输入的不一定是int,也可能是名字是一个字符串,换一下set集合的单位,改成string,而不是int,ab也都是string类

好了,刚改完,编译错误了,为什么,本地测试样例结果正确例,HOJ编译错了👀

好了C++编译器换G++过了

Accepted209493MS1428K447 BG++BATHERO

完整代码

#include<iostream>
#include<set>
using namespace std;
int main(){
    int n;
    set<string> T,L;
    while(cin>>n && n){
        string a,b;
        for(int i=0;i<n;i++){
            cin>>a>>b;
            T.insert(a);T.insert(b);
            L.insert(b);
        }
        if(T.size()-L.size()==1){
            cout <<"Yes";
        }else{
            cout <<"No";
        }
        T.clear();L.clear();
        cout<<endl;
    }
    return 0;
}

OK

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值