洛谷P1039 [NOIP2003提高组]侦探推理

题目描述

明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:

证词中出现的其他话,都不列入逻辑推理的内容。

明明所知道的是,他的同学中有 N 个人始终说假话,其余的人始终说真。

现在,明明需要你帮助他从他同学的话中推断出谁是真正的罪犯,请记住,罪犯只有一个!

输入格式

输入由若干行组成。

第一行有三个整数,M, N 和P。M是参加游戏的明明的同学数,N是其中始终说谎的人数,P是证言的总数。

接下来M行,每行是明明的一个同学的名字(英文字母组成,没有空格,全部大写)。

往后有P 行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。证词每行不会超过 250个字符。

输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。

输出格式

如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是罪犯,则输出 Cannot Determine;如果程序判断出没有人可能成为罪犯,则输出 Impossible。

输入输出样例

说明/提示

对于 100% 数据,满足1≤M≤20,0≤NM,1≤P≤100。

【题目来源】

NOIP 2003提高组第二题

解题思路:

单凭一条条证言判断某人是说真话还是假话是很难的,但因为只有一名罪犯,所以枚举每位同学,假设某同学是罪犯,来判断各条证言是否成立来判定某人是说真话还是假话?

另外证言中有说今天是星期几,但不能确定当天是星期几,无法直接判定是说真话还是假话?所以也要枚举星期,然后根据n个人是始终说谎的来判断说谎的同学。

每个句子有三种情况:真话、假话、废话。最终只要假话数量≤n≤假话数量 + 废话数量,那么说谎的同学就有可能有n个。

正确理解题目

只有以下五种句式的证言是有效证言,其余都是无效证言(废话)。

I am guilty.

I am not guilty.

XXX is guilty.

XXX is not guilty.

Today is XXX.

证词的含义

  1. 说真话、说假话与是否是罪犯没有任何关系。
  2. XXX指认YYY是罪犯:若是真话,YYY就是罪犯;若是假话,YYY不是罪犯,罪犯是除YYY之外的某一个人。
  3. XXX指认YYY不是罪犯:若是真话,YYY不是罪犯,罪犯是除YYY之外的某一个人;若是假话,YYY就是罪犯。
  4. 今天是星期几:用以辅助判断证人说的是真话还是假话。如两个人说的不是同个星期几,那么其中至少有人说假话。

注意题目中说“N个人始终说假话,其余的人始终说真”,意思是一个人的证词要么全部为真,要么全部为假。注意,不在上述类型的证词,可以算是真话,也可以算是假话。因为有“废话”存在,说真话人数不超过M-N,说假话人数不超过N。

推理算法

单从证词去推理是不可行的,因为不知道谁说了真话、谁说了假话,不能把真话、假话放在一起推理。

思路就是枚举某人是罪犯,再枚举今天是星期几,然后就可以判断每个证言是说真话还是假话。

每次枚举时,标记每个人说的是什么话,如果一个人既说真话又说假话,那就说明你的假设不成立,与题目矛盾,直接跳过此种情况。

如找不到罪犯则输出 Impossible;如果程序判断出罪犯超过1人,则输出Cannot Determine。

时间复杂度分析:

依次枚举可能的罪犯、星期几以及证言句子,所以总时间复杂度是O(7mp),其中m是总人数,p是总证言数。

完整代码:

weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']def parse(s):											# 解析证言句子,返回:“某人”说“某某人”是/不是罪犯,或今天是星期几name, test = s.split(': ', 1)if test == 'I am guilty':							# 某人说自己是罪犯return (name, name, 'yes')elif test == 'I am not guilty':						# 某人说自己不是罪犯return (name, name, 'no')elif test.endswith(' is guilty'):					# 检测是否以' is guilty'结尾obj = test.split(' ')[0]						# 某人说某某人是罪犯return (name, obj, 'yes')elif test.endswith(' is not guilty'):				# 检测是否以' is not guilty'结尾obj = test.split(' ')[0]						# 某人说某某人不是罪犯return (name, obj, 'no')elif test.startswith('Today is '):day = test.split(' is ')[1]						# 某人说今天是星期几return (name, None, 'day', day)else:												# 无效证言return (name, None, None)def analyze(testimony, guilty, weekday):if testimony[2] == 'yes':return guilty == testimony[1]elif testimony[2] == 'no':return guilty != testimony[1]elif testimony[2] == 'day':return weekday == testimony[3]m, n, p = [int(i) for i in input().split()]
names = [input() for i in range(m)]						# 嫌疑犯名单
testimonys = [parse(input()[:-1]) for i in range(p)]	# 证言,去除尾部句点(.)suspects = set()										# 嫌疑犯(去重)
for guilty in names:									# 枚举罪犯是谁for weekday in weekdays:							# 枚举今天是星期几judge = {}impossbile = Falsefor testimony in testimonys:					# 枚举各证言测试在这种情况下是否为真speaker = testimony[0]result = analyze(testimony, guilty, weekday)if speaker not in judge and result != None:judge[speaker] = resultelif speaker in judge and result != None and result != judge[speaker]:judge[speaker] = 'reject'impossbile = Truebreakif not impossbile and list(judge.values()).count(True) <= m-n and list(judge.values()).count(False) <= n:suspects.add(guilty)if len(suspects) == 0:									# 无解print('Impossible')
elif len(suspects) > 1:									# 多解print('Cannot Determine')
else:print(list(suspects)[0])

运行结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/673409.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用SM4国密加密算法对Spring Boot项目数据库连接信息以及yaml文件配置属性进行加密配置(读取时自动解密)

一、前言 在业务系统开发过程中,我们必不可少的会使用数据库,在应用开发过程中,数据库连接信息往往都是以明文的方式配置到yaml配置文件中的,这样有密码泄露的风险,那么有没有什么方式可以避免呢?方案当然是有的,就是对数据库密码配置的时候进行加密,然后读取的时候再…

人工智能|推荐系统——基于tensorflow的个性化电影推荐系统实战(有前端)

代码下载&#xff1a; 基于tensorflow的个性化电影推荐系统实战(有前端).zip资源-CSDN文库 项目简介&#xff1a; dl_re_web : Web 项目的文件夹re_sys&#xff1a; Web app model&#xff1a;百度云下载之后&#xff0c;把model放到该文件夹下recommend&#xff1a; 网络模型相…

寒假作业-day5

1>现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用直接插入排序实现升序排序 函数4:请使用插入排序实现升序排序 代码&#xff1a; #include<stdio.h&g…

macbook电脑如何永久删除app软件?

在使用MacBook的过程中&#xff0c;我们经常会下载各种App来满足日常的工作和娱乐需求。然而&#xff0c;随着时间的积累&#xff0c;这些App不仅占据了宝贵的硬盘空间&#xff0c;还可能拖慢电脑的运行速度。那么&#xff0c;如何有效地管理和删除这些不再需要的App呢&#xf…

如何使用websocket

如何使用websocket 之前看到过一个面试题&#xff1a;吃饭点餐的小程序里&#xff0c;同一桌的用户点餐菜单如何做到的实时同步&#xff1f; 答案就是&#xff1a;使用websocket使数据变动时服务端实时推送消息给其他用户。 最近在我们自己的项目中我也遇到了类似问题&#xf…

使用CMSIS-DSP库进行嵌入式音频信号处理

在嵌入式环境下&#xff0c;使用CMSIS-DSP库进行音频信号处理是一种常见的应用场景。通过CMSIS-DSP库&#xff0c;开发人员可以利用嵌入式系统的处理能力来实现各种数字信号处理&#xff08;DSP&#xff09;功能&#xff0c;例如音频滤波、均衡器、噪音消除等。本文将介绍如何在…

问题 | IT行业有哪些证书含金量高?

IT行业有哪些证书含金量高? Cisco认证&#xff08;CCNA&#xff0c;CCNP&#xff0c;CCIE&#xff09;&#xff1a;思科是全球最大的网络设备供应商之一&#xff0c;它的认证证书在网络和通信领域被广泛认可。CCNA是初级认证&#xff0c;CCNP是高级认证&#xff0c;而CCIE是专…

NLP_Seq2Seq编码器-解码器架构

文章目录 Seq2Seq架构构建简单Seq2Seq架构1.构建实验语料库和词汇表2.生成Seq2Seq训练数据3. 定义编码器和解码器类4.定义Seq2Seq架构5. 训练Seq2Seq架构6.测试Seq2Seq架构 归纳Seq2Seq编码器-解码器架构小结 Seq2Seq架构 起初&#xff0c;人们尝试使用一个独立的RNN来解决这种…

CentOS7搭建Hadoop集群

准备工作 1、准备三台虚拟机&#xff0c;参考&#xff1a;CentOS7集群环境搭建&#xff08;3台&#xff09;-CSDN博客 2、配置虚拟机之间免密登录&#xff0c;参考&#xff1a;CentOS7集群配置免密登录-CSDN博客 3、虚拟机分别安装jdk&#xff0c;参考&#xff1a;CentOS7集…

【51单片机】实现一个动静态数码管显示项目(前置知识铺垫,代码&图演示)(5)

前言 大家好吖&#xff0c;欢迎来到 YY 滴单片机 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过单片机的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY…

vue electron应用调exe程序

描述 用Python写了一个本地服务编译成exe程序&#xff0c;在electron程序启动后&#xff0c;自动执行exe程序 实现 1. 使用node的child_process模块可以执行windows执行&#xff0c;通过指令调exe程序 // electron/index.js var cp require("child_process"); /…

.NET Core 实现 JWT 认证

写在前面 JWT&#xff08;JSON Web Token&#xff09;是一种开放标准, 由三部分组成&#xff0c;分别是Header、Payload和Signature&#xff0c;它以 JSON 对象的方式在各方之间安全地传输信息。通俗的说&#xff0c;就是通过数字签名算法生产一个字符串&#xff0c;然后在网络…

bpmn.js一个基于Bpmn 2.0的前端工作流展示和绘制工具

bpmn.js是由开源工作流引擎camunda内部组织BPMN.IO组织开发的一款基于BPMN 2.0的工作流展示、编辑的web端工具库。由于工作流引擎activiti、flowable、camunda属于同宗分流&#xff0c;其工作流定义格式大致相同&#xff0c;所以我们可以使用bpmn.js完美融合其中任一工作流引擎…

VScode为什么选择了Electron,而不是QT?

选择Electron而不是QT可能是基于以下几个原因&#xff1a; Web技术的普及和开发者生态系统&#xff1a;Web技术如HTML、CSS和JavaScript在开发者中非常普及&#xff0c;开发者生态系统庞大且活跃。使用Electron可以利用这些熟悉的Web技术和丰富的开发者社区资源。跨平台支持&am…

CleanMyMac是否有必要购买?2024有啥优惠

CleanMyMac X是一款专业的Mac电脑清理和优化工具&#xff0c;它提供了多种功能&#xff0c;如智能清理、系统垃圾清理、恶意软件移除、个人隐私保护、优化加速等&#xff0c;可以帮助用户解决Mac系统维护问题&#xff0c;保持Mac电脑的最佳运行状态。 此外&#xff0c;Mac电脑的…

文件上传的另类应用

1.Imagemagick CVE-2016-3714 CVE-2022-44268 CVE-2020-29599可在vulhub靶场进行复现1.1.Imagemagick简介 ImageMagic是一款图片处理工具&#xff0c;当传入一个恶意图片时&#xff0c;就有可能存在命令注入漏洞。 ImageMagick默认支持一种图片格式mvg&#xff0c;而mvg与svg…

登录+JS逆向进阶【过咪咕登录】(附带源码)

JS渗透之咪咕登录 每篇前言&#xff1a;咪咕登录参数对比 captcha参数enpassword参数搜索enpassword参数搜索J_RsaPsd参数setPublic函数encrypt加密函数运行时可能会遇到的问题此部分改写的最终形态JS代码&#xff1a;运行结果python编写脚本运行此JS代码&#xff1a;运行结果&…

Java实现民宿预定管理系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 用例设计2.2 功能设计2.2.1 租客角色2.2.2 房主角色2.2.3 系统管理员角色 三、系统展示四、核心代码4.1 查询民宿4.2 新增民宿4.3 新增民宿评价4.4 查询留言4.5 新增民宿订单 五、免责说明 一、摘要 1.1 项目介绍 基于…

Android7.0-Fiddler证书问题

一、将Fiddler的证书导出到电脑&#xff0c;点击Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop 二、下载Window版openssl&#xff0c; 点击这里打开页面&#xff0c;下拉到下面&#xff0c;选择最上面的64位EXE点击下载安装即可 安…

51单片机 跑马灯

#include <reg52.h>//毫秒级延时函数 void delay(int z) {int x,y;for(x z; x > 0; x--)for(y 114; y > 0 ; y--); }sbit LED1 P1^0x0; sbit LED2 P1^0x1; sbit LED3 P1^0x2; sbit LED4 P1^0x3; sbit LED5 P1^0x4; sbit LED6 P1^0x5; sbit LED7 P1^0x6; s…