当前位置: 首页 > news >正文

P1039 [NOIP2003 提高组] 侦探推理

此题难度为:提高+/省选-

作者为:CCF_NOI

题目描述

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

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

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

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

输入格式

输入由若干行组成。

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

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

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

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

输出格式

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

输入输出样例

输入 #1

3 1 5
MIKE
CHARLES
KATE
MIKE: I am guilty.
MIKE: Today is Sunday.
CHARLES: MIKE is guilty.
KATE: I am guilty.
KATE: How are you??

输出#1

MIKE

说明/提示

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

解析加代码:

//可以用map存人名对应的下标 //我们枚举每一个人i,假设i是罪犯
//然后枚举今天是星期几,用day表示 
//然后判断有没有矛盾//如何判断?
//进行每一次判断的时候,先使所有人的状态不确定,也就是不知道他们会说真话假话
//TF[a]==-1是不确定,TF[a]=1是说真话,TF[a]=0是说假话
//T是说真话的人数,F是说假话的人数 
//设罪犯为 i 
//设flag为这句话是真话还是假话,flag=1是真话,flag=0是假话 
//id是说这句话的人 
//枚举每一句话
//	看一下id以前的状态,如果状态不确定(TF==-1),就TF[id]=flag
//	否则,如果和以前状态一样(TF[id]==flag),就没有矛盾,
//	TF[id]!=flag就是出现了矛盾(因为一个人始终直说一种话),判断不出来了,直接return去枚举下一个人是罪犯 
//如果F>n或者T>m-n了,也就是说假话的人数超过了题目中给的人数,矛盾,return
//如果找到了不止一个罪犯,输出"Cannot Determine",直接exit(0) //怎么知道这句话是真话假话? 
//①如果话里有 "I am guilty."
//	那么看一下id是不是i,不是的话,就是在说假话
//②话里有"I am not guilty"
//	看一下id是不是i,不是的话,就是在说真话,否则就是假话 
//③话里有"xxx is guilty"
//	如果xxx是i的话,就是真话,否则是假话
//④话里有"xxx is not guilty"
//	如果xxx不是i的话,就是真话,否则是假话
//⑤话里有"Today is XXX"
//	如果xxx与day一样,就是真话,否则是假话#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;string S[10]=
{"Today is Sunday.","Today is Monday.","Today is Tuesday.","Today is Wednesday.","Today is Thursday.","Today is Friday.","Today is Saturday.",
};int m,n,p;
int T,F,ans;
int TF[25];
struct Sen
{int id;string s;
}sen[105];
map<string,int> ma;bool judgeTF(int id,bool flag)	//看一下有没有冲突,return 1 表示有冲突 
{if(TF[id]==-1)		//状态不确定 {TF[id]=flag;	//赋状态 if(flag)	//说真话的人数++ ++T;else	//说假话的人数++ ++F;}elsereturn TF[id]!=flag;	//和之前的一不一样,一样返回0,不一样返回1 if(F>n||T>m-n)	//说假话的人比n多或者是说真话的人比m-n多 return 1;return 0;
}void judge(int id,string day)
{memset(TF,-1,sizeof(TF));	//所有人都不知道说的是真话假话 T=F=0;		//说真话、假话人数置0 string tmp;for(int i=1;i<=p;++i){int pos=sen[i].s.find("I am guilty.");	//pos为-1则没说这句话 if(~pos){if(judgeTF(sen[i].id,sen[i].id==id))	//因为我们假设了id是罪犯,所以不是id的人就不是罪犯,就是在说假话return;}pos=sen[i].s.find("I am not guilty");if(~pos){if(judgeTF(sen[i].id,sen[i].id!=id))return;}pos=sen[i].s.find(" is guilty.");if(~pos){tmp=sen[i].s;tmp.erase(pos,11);if(judgeTF(sen[i].id,ma[tmp]==id))return;}pos=sen[i].s.find(" is not guilty.");if(~pos){tmp=sen[i].s;tmp.erase(pos,15);if(judgeTF(sen[i].id,ma[tmp]!=id))return;}pos=sen[i].s.find("Today is ");if(~pos){if(judgeTF(sen[i].id,sen[i].s==day))return;}}if(ans&&ans!=id)	//找到了不止一个罪犯 {puts("Cannot Determine");	//不能确定 exit(0);}ans=id;		//id是罪犯 
}string s[25],name,a;
int main()
{scanf("%d%d%d",&m,&n,&p);for(int i=1;i<=m;++i){cin>>s[i];ma[s[i]]=i;		//存名字标号 }for(int i=1;i<=p;++i){cin>>name;		//输入说话者 name.erase(name.length()-1,1);		//把后边的冒号搞掉 getline(cin,a);a.erase(0,1);	//把前边的空格搞掉 if(a[a.length()-1]=='\n'||a[a.length()-1]=='\r')	//把坑爹的换行符搞掉 a.erase(a.length()-1,1);sen[i].id=ma[name];		//存说话者 sen[i].s=a;		//存说话内容 }for(int i=1;i<=m;++i)	//假设第i个人是罪犯 for(int j=0;j<7;++j)	//假设今天是S[j]天 judge(i,S[j]);if(!ans)	//找不到罪犯 puts("Impossible");elsecout<<s[ans];	//罪犯名字 return 0;
}

成功图片: 

 

相关文章:

P1039 [NOIP2003 提高组] 侦探推理

此题难度为&#xff1a;提高/省选- 作者为&#xff1a;CCF_NOI 题目描述 明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中&#xff0c;于是他召集了一群同学玩推理游戏。游戏的内容是这样的&#xff0c;明明的同学们先商量好由其中的一个人充当罪犯&#xff08;在明…...

模拟电路学习笔记 - 概念与结论

真空二极管&#xff0c;电子管ENIAC发源地&#xff0c;基础方法二极管双极管三极管场向管学习特性&#xff0c;最终运放运方的目的是运用&#xff0c;射频&#xff0c;计算…放大电路大功率元器件和微元器件学习他们的特性分粒 集成设计的角度&#xff0c;不要仅仅分析设计的前…...

Linux驱动开发:I2C子系统

目录 1、I2C简介 1.1 两根线 1.2 信号 1.3 写时序 1.4 读时序 1.5 I2C速率 1.6 I2C驱动框架简介 2、I2C设备驱动 2.1 I2C相关API 2.1.1 i2c_driver 2.1.2 注册&#xff1a;i2c_add_driver 2.1.3 注销&#xff1a;i2c_del_driver 2.1.4 module_i2c_driver&#xff…...

[C++] 动态内存与智能指针

众所周知&#xff0c;C五大内存区&#xff1a;全局数据区(静态区)、代码区、栈区、堆区、常量区。 全局数据区(静态区)&#xff1a;存放全局变量&#xff0c;静态数据和常量&#xff1b; 代码区&#xff1a;存放所有类成员函数和非成员函数代码&#xff0c;函数体的二进制代码。…...

多态的原理

有了虚函数&#xff0c;会在类的对象增加一个指针&#xff0c;该指针就是虚函数表指针_vfptr;虚表本质就是函数指针数组,虚表里面存放着该对象的虚函数的地址&#xff1b; 派生类继承有虚函数基类的对象模型 子类继承父类的虚表指针时&#xff0c;是对父类的虚表指针进行了拷…...

RK3588平台开发系列讲解(内存篇)Linux 伙伴系统数据结构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、 页二、区三、内存节点沉淀、分享、成长,让自己和他人都能有所收获!😄 📢Linux 系统中,用来管理物理内存页面的伙伴系统,以及负责分配比页更小的内存对象的 SLAB 分配器了。 本篇将介绍伙伴系统相关数据结…...

Windows(MFC/C++)上进程间通讯的几种简单又实用的方法

前段时间&#xff0c;做了一个项目&#xff0c;涉及数据传输。项目实现方式有很多种&#xff0c;但不同的实现方式&#xff0c;对数据的传输方法不同&#xff0c;且各有优缺点。 下文就不同情况来如何选择数据传输(通讯)方式。 先说说需求&#xff0c;模块A获取测试数据&#…...

嘉兴桐乡会计考证培训-备考中级职称有必要报班吗?

备考中级会计职称有必要报班吗&#xff1f;其实&#xff0c;备考报班不能说是必需的&#xff0c;但听课学习确实是节省时间的一种方式&#xff0c;根据同学们的反馈&#xff0c;自学所花费的时间远远多于跟着老师学。上元教育就整理了一些学员报班之前走过的弯路 报班之前 在2…...

java元注解和自定义注解的区别

Java的元注解和自定义注解是两个不同的概念。 元注解是Java内置的一组用于修饰其他注解的注解&#xff0c;包括Retention、Target、Inherited和Documented。它们可以控制被修饰的注解的保留策略、目标范围、是否继承等属性&#xff0c;并且可以在编写自定义注解时使用。 Retent…...

技术到底是什么

背景 我发了朋友圈&#xff1a;做了个奇怪的梦&#xff0c;梦见被离职了&#xff0c;理由竟然是&#xff1a;你技术太菜了 我补充评论&#xff1a;我还没想明白怎么回事&#xff0c;就醒了。有点遗憾的是&#xff1a;想再努力反驳两句&#xff0c;结果没机会了… 很多人评论…...

什么CRM客户管理系统最好?

产业互联网背景下&#xff0c;企业数字化转型日渐深化。毋庸置疑&#xff0c;客户是企业的命脉&#xff0c;企业发展的关键便是以客户为中心&#xff0c;为客户创造价值&#xff0c;并不断实现企业的可持续性增长&#xff0c;而这也是每个企业永不落幕的主题。 一套优秀的CRM客…...

吴军《计算之魂》读后感

前言 断断续续&#xff0c;终于完成了这本书的第一次通读&#xff0c;记录下自己的一些想法。 先说一个小故事。前段时间家里买了一个小鱼缸&#xff0c;问我有没有办法让水自动循环&#xff0c;但不想用电。没有好的想法&#xff0c;去小某书上搜了下&#xff0c;好多案例教…...

CSS进阶

01-复合选择器 定义&#xff1a;由两个或多个基础选择器&#xff0c;通过不同的方式组合而成。 作用&#xff1a;更准确、更高效的选择目标元素&#xff08;标签&#xff09;。 后代选择器 后代选择器&#xff1a;选中某元素的后代元素。 选择器写法&#xff1a;父选择器 …...

金兰组织 | 2023金兰解决方案集经营管理篇正式发布

为助力企业创新管理、提质增效&#xff0c;人大金仓携手金兰组织成员单位&#xff0c;于近期发布多项经营管理领域的联合解决方案&#xff0c;共享创新应用成果。 /人大金仓高级副总裁宋瑞/ 人大金仓高级副总裁宋瑞在致辞中表示&#xff1a;“联合解决方案创新是指通过把不同领…...

【python】pytorch包:深度学习(序章)

今日听闻师姐说pytorch实现深度学习要比keras更好用一些&#xff0c;特此记录 Part 0. 机器学习 与 深度学习 的联系与区别 参考B站视频链接 联系 深度学习是机器学习的分支&#xff0c;人工神经网络为基础&#xff0c;对数据的特征进行学习的方法 区别 特征抽取 机器学…...

HTML <acronym> 标签

HTML5 中不支持 <acronym> 标签在 HTML 4 中用于定义首字母缩写词。 实例 标记一个首字母缩写&#xff1a; <acronym title"World Wide Web">WWW</acronym> 浏览器支持 IEFirefoxChromeSafariOpera 所有主流的浏览器均支持 <acronym> …...

python基本数据类型 - 字典集合

引入 在内存中存储的数据可以是不同的数据类型。比如名字可以使用字符串存储&#xff0c;年龄可以使用数字存储&#xff0c;python有6种基本数据类型&#xff0c;用于各种数据的存储&#xff0c;分别是&#xff1a;numbers(数字类型)、string(字符串)、List(列表)、Tuple(元组…...

python数据类型总结

标准数据类型 Python 有以下几种标准数据类型&#xff1a; 整数&#xff08;int&#xff09;&#xff1a;表示整数值&#xff0c;如 1, -5, 0 等。浮点数&#xff08;float&#xff09;&#xff1a;表示小数值&#xff0c;如 3.14, -0.01, 1.0 等。字符串&#xff08;str&…...

TS内置类型总结

typeof 取对象身上的类型 const person {name: ,job: ,age:18 } type p typeof person ->> type p {name: string;job: string;age: number; }keyof取一个类型的属性明作为一个联合类型 const person {name: ,job: ,age: 18 } type p typeof person type k keyof p…...

Spring Cloud Alibaba: Gateway 网关过滤器 GatewayGatewayFilter factory (记录)

目录 AddRequestHeader GatewayFilter factory AddRequestHeadersIfNotPresent GatewayFilter factory AddRequestParameter GatewayFilter Factory AddResponseHeader GatewayFilter Factory CircuitBreaker GatewayFilter factory circuit breaker based on the status…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

python执行测试用例,allure报乱码且未成功生成报告

allure执行测试用例时显示乱码&#xff1a;‘allure’ &#xfffd;&#xfffd;&#xfffd;&#xfffd;&#xfffd;ڲ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ⲿ&#xfffd;&#xfffd;&#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;ǿ&#xfffd;&am…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践

作者&#xff1a;吴岐诗&#xff0c;杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言&#xff1a;融合数据湖与数仓的创新之路 在数字金融时代&#xff0c;数据已成为金融机构的核心竞争力。杭银消费金…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...