首页 > 编程语言 >上海计算机学会2022年5月月赛C++乙组T3狼人游戏(二)

上海计算机学会2022年5月月赛C++乙组T3狼人游戏(二)

时间:2024-08-02 20:28:36浏览次数:17  
标签:发言 int father 狼人 乙组 C++ 矛盾 预言家 ff

狼人游戏(二)

内存限制: 256 Mb时间限制: 1000 ms

题目描述

有 n 名玩家在玩狼人游戏,有一些玩家的身份是狼人。其余玩家的身份是预言家。游戏的进程中,陆续出现了 m 句发言,每句发言来自于某个玩家,发言的信息是声称另一个玩家的身份是狼人或者是预言家。

小爱猜想,狼人的发言应该永远与事实相反,而预言家的发言应该永远与事实相同。她想检查一下,她的猜想是否会与发言记录产生矛盾,如果出现矛盾,请求出她的猜想与哪一条发言最先出现矛盾。

输入格式

第一行:两个整数 n 与 m
第二行到 m+1 行:第 i+1 行有两个整数:si​ 和 oi​,接下来有一个字符:
– 如果是 T,表示 si​ 宣称 oi​ 是预言家;
– 如果是 F,表示 si​ 宣称 oi​ 是狼人;

输出格式

如果没有矛盾,输出 Passed,否则输出第一次出现矛盾的位置。

数据范围
  • 对于 30% 的数据,1≤n,m≤20;
  • 对于 60% 的数据,1≤n,m≤300;
  • 对于 100% 的数据,1≤n,m≤500,000;
样例数据

 输入:
4 3
1 2 T
3 4 F
2 1 F
输出:
3
说明:
第三句话与第一句产生了矛盾
输入:
4 4
1 2 F
2 3 T
3 4 T
2 1 F
输出:
Passed
说明:
1是狼人,其余都是预言家,就不会有矛盾

解析:

根据发言,如果s说o是预言家,那么有两种可能:

1.s是预言家,则说的是真话,o是预言家;

2.s是狼人,则说的是假话,o是狼人;

即s和o是一伙人。

同理,若s说o是狼人,那么s和o不是一伙人。

利用并查集,将一伙人放到同一集合,对手放到另一集合,若出现矛盾,即输出。

详见代码:

#include <bits/stdc++.h>
using namespace std;
int father[1000005];//定义father[i]为己方集合,father[n+i]为对手方集合
int n, m;
int ff(int x) {//找爸爸
    if (father[x] == x) return x;
    father[x] = ff(father[x]);
    return father[x];
}
void un(int x, int y) {//集合合并
    int xx = ff(x);
    int yy = ff(y);
    if (xx != yy) {
        father[yy] = xx;
    }
    return;
}
int main() {
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    cin >> n >> m;
    for(int i = 1; i <= n; i++) {//初始化
        father[i] = i;
        father[n + i] = n + i;
    }
    for(int i = 1; i <= m; i++) {
        int x, y;
        char ch;
        cin >> x >> y >> ch;
        if (ch == 'T') {//若说对方是预言家
            //任意一方和另一方的对手是同一集合即矛盾
            if (ff(x + n) == ff(y) || ff(x) == ff(y + n)) {
                cout << i;
                return 0;
            } else {//不矛盾
                un(x, y);//加入同一集合
                un(x + n, y + n);//对手方加入同一集合
            }
        } else {//说对方是狼人
            //若二人为同一集合或二人的对手方为同一集合即矛盾
            if (ff(x) == ff(y) || ff(x + n) == ff(y + n)) {
                cout << i;
                return 0;
            } else {//不矛盾
                un(y, x + n);//跟另一方的对手同一集合
                un(x, y + n);
            }
        }
    }
    cout << "Passed";
    return 0;
}

标签:发言,int,father,狼人,乙组,C++,矛盾,预言家,ff
From: https://blog.csdn.net/qq_36230375/article/details/140879432

相关文章

  • C++语法基础之输入输出(易理解巨详细)
    Unit1C++语法基础之基本输入输出本次分享属于C++语法基础系列课,标准输入输出的理解和使用C++语法基础之输入输出标准输入输出介绍(一)输入输出流(概念比较抽象,可先理解代码,回头进行理解性记忆)1、概念2、输入流(InputStreams)3、输出流(OutputStreams)(二)标准输出1、输......
  • C++中const关键字的作用?
    const关键字的作用?const主要用来定义常量和保护变量不被修改:定义常量:使用const可以定义一个不可修改的常量,const常量的默认链接方式是内部链接(只有该源文件可见),可以将其定义在头文件中而不会引起重复定义问题,每个包含该头文件的源文件都各自拥有一个const常量的副本。//......
  • 【C++】引用和指针的不同点
    引用和指针的不同点:(从使用的角度去对比,按自己的理解的角度去梳理,硬记很难记全,虽然不赢记大概率也记不全)1.引用概念上定义一个变量的别名,指针存储一个变量地址。2.引用在定义时必须初始化,指针没有要求。3.引用在初始化时引用一个实体后,就不能再引用其他实体;而指针可以在......
  • 【C++】运算符重载
    一、示例如果我想实现以下代码,按照下面的写法是不能正常运行的。classPerson{public:intm_A;intm_B;};Personp1;p1.m_A=10;p1.m_B=10;Personp2;p2.m_A=10;p2.m_B=10;Personp3;p3=p1+p2;按照以上学过的内容,可以自己写成员函数,实......
  • C++高级功能
    Lambda匿名函数[只读列表](参数列表){函数体}例如:sort(a+1,a+n,[](constData&x,constData&y){returnx.val<y.val;}constintk=5;autocalc=[k](constint&x){returnx*k;}template模板在struct/namespace/函数前加入template<typ......
  • Windows图形界面(GUI)-MFC-C/C++ - 静态文本框(Static Text) - CStatic
    公开视频-> 链接点击跳转公开课程博客首页-> ​​​链接点击跳转博客主页目录静态文本框(StaticText)-CStatic基本概念成员函数示例代码静态文本框(StaticText)-CStatic基本概念静态文本框是一种用于显示文本的控件,用户不能编辑其中的文本。静态文本框......
  • window配置onnxruntime,运行c++版本
    为了使用ONNX-Runtime-Inference这个项目,但是我缺少onnxruntime这个库,网上找了很多教程,但是大多数都是关于linux的,这里简单记录一下我的配置流程找到onnxruntime的release版本开始想着自己去找源码编译,发现这对于新手来说,是个坑,因为源码里面有些库是缺失的,需要自己去下载,并更改......
  • 【C++】学习笔记——智能指针
    文章目录二十一、智能指针1.内存泄漏2.智能指针的使用及原理RAII智能指针的原理auto_ptrunique_ptrshared_ptrshared_ptr的循环引用weak_ptr删除器未完待续二十一、智能指针1.内存泄漏在上一章的异常中,我们了解到如果出现了异常,会中断执行流,跳转到catch处。但......
  • 【C++】学习笔记——特殊类的设计
    文章目录二十二、特殊类的设计1.请设计一个类,不能被拷贝2.请设计一个类,只能在堆上创建对象3.请设计一个类,只能在栈上创建对象4.请设计一个类,不能被继承5.请设计一个类,只能创建一个对象(单例模式)未完待续二十二、特殊类的设计1.请设计一个类,不能被拷贝拷贝......
  • 【C++庖丁解牛】C++特殊类设计 | 单例模式
    ......