P1039 [NOIP2003 提高组] 侦探推理

news2024/11/26 0:42:24

题目描述

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

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

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

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

输入格式

输入由若干行组成。

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

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

往后有 �P 行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。证词每行不会超过 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≤�≤201≤M≤20,0≤�≤�0≤N≤M,1≤�≤1001≤P≤100。

【题目来源】

NOIP 2003 提高组第二题

//记录每一句话是谁说的以及这句话的内容
//可以用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;
	}
	else
		return 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");
	else
		cout<<s[ans];	//罪犯名字 
	return 0;
}

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

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

相关文章

Java-设计模式中事件与委托Java版本

目录 背景介绍 实现过程 类图 NS图 代码 客户端 业务封装类 委托类 事件类 猫类 老鼠类 运行结果 总结提升 背景介绍 相信大家在学习大话设计模式的时候都有接触过事件与委托&#xff0c;但是对于事件与委托具体的业务逻辑也不是很清楚&#xff0c;只能照猫画虎去使用…

SEO机制算是让我玩明白了

获取当前时间时间戳&#xff0c;返回遵循ISO 8601扩展格式的日期 new Date(Date.now()).toISOString() 使用moment库转换回来 this.moment(new Date(Date.now()).toISOString()).format("YYYY-MM-DD") js去掉富文本中html标签和图片 filterHtmlTag(val) {if(!val){…

Shell编程规范与使用

一、Shell脚本概述 1&#xff09;Shell的作用——命令解释器&#xff0c;“翻译官” Linux 系统中的 Shell 是一个特殊的应用程序&#xff0c;它介于操作系统内核与用户之间&#xff0c;充当 了一个“命令解释器”的角色&#xff0c;负责接收用户输入的操作指令&#xff08;命…

接口协作--apipost接口协作工具

接口协作 apipost支持接口在线协作编辑功能&#xff0c;打开apipost创业一个团队&#xff0c;在创建一个项目。 在把需要一起协作的人员添加到团队中 在进行项目编辑把需要进行协作的人员拉取到项目中 之后在进入项目创建接口就可以进行接口协作了

scratch猫捉老鼠 少儿编程 电子学会图形化编程scratch编程等级考试二级真题和答案解析2023年3月

目录 scratch猫捉老鼠 一、题目要求 1、准备工作 2、功能实现 二、案例分析

kafka调试脚本的使用

创建名称为test的topic且副本数量3&#xff0c;partition数量6 /etc/kafka/kafka/bin/kafka-topics.sh --create --bootstrap-server 10.1.60.112:9092 --replication-factor 3 --partitions 6 --topic test 查看名称为test的topic信息 /etc/kafka/kafka/bin/kafka-topics.sh -…

uniapp微信小程序图片预览PreviewImage

一、说明 功能&#xff1a;点击图片预览大图&#xff0c;并且可以通过滑动查看不同图片的预览大图。 点击预览大图后&#xff1a; 二、上代码 参考uniapp官方文档 其提供了预览大图的函数uni.previewImage(OBJECT). //放大查看推荐图片enlargePicture(index) {console.log…

【Unity-ML】Unity机器学习(一)

安装环境&#xff1a;Windows10 Anaconda3(64-bit)&#xff0c;网上很多教程&#xff0c;例如这个anaconda下载及安装(保姆级教程) - 知乎anaconda包管理器和环境管理器&#xff0c;强烈建议食用 1.下载官网下载太慢可选用镜像下载 官网下载&#xff1a; Anaconda | Individua…

Softing FiberXpert 700光纤测试套件助力一级多模和单模光纤认证

FiberXpert 700是用于多模和单模的四路波长测试套件&#xff0c;不仅可以对光纤链路进行直观、灵活和快速地认证&#xff0c;而且可以导出数据报告。 测试网络安装以确保其符合指定标准的过程称为认证&#xff0c;并且这通常需要纸质文件作为符合标准的证明。而FiberXpert 700光…

Docker 的数据管理

一、Docker 的数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿…

为什么说网络安全行业是IT的风口行业?

前言 2023年网络安全行业的前景看起来非常乐观。根据当前的趋势和发展&#xff0c;一些趋势和发展可能对2023年网络安全行业产生影响&#xff1a; 5G技术的广泛应用&#xff1a;5G技术的普及将会使互联网的速度更快&#xff0c;同时也将带来更多的网络威胁和安全挑战。网络安全…

eBPF技术介绍

前言 eBPF起源于linux内核&#xff0c;它可以以砂箱程序运行在操作系统内核的特权上下文&#xff0c;高效&#xff0c;安全&#xff0c;易于扩展而不需要修改内核源码或者加载内核模块。 操作系统一直是实现观测&#xff0c;安全和网络功能的最理想的地方&#xff0c;因为内核的…

Vue基本的内置指令

前言 除了常见的v-bind,v-for,v-if,v-on.v-model等&#xff0c;本次学习一些vue提供的其他内置指令 1 v-text 给标签插入文本&#xff0c;类似于插值语法 它会把全部的字符串当成文本去解析,不会当成标签的,哪怕写的是标签结构 效果和插值语法是一样的 插值语法比v-text更加…

P1037 [NOIP2002 普及组] 产生数

题目描述 给出一个整数 &#xfffd;n 和 &#xfffd;k 个变换规则。 规则&#xff1a; 一位数可变换成另一个一位数。规则的右部不能为零。 例如&#xff1a;&#xfffd;234,&#xfffd;2n234,k2。有以下两个规则&#xff1a; 2⟶52⟶5。3⟶63⟶6。 上面的整数 23423…

SpringBoot的配置和日志

1.配置文件的作用和意义 配置文件中配置整个项目中所有重要的数据&#xff0c;比如&#xff1a; 1.数据库的连接信息&#xff08;包含用户名和密码的设置&#xff09;&#xff1b; 2.项目的启动端口&#xff1b; 3.第三方系统的调用秘钥等信息&#xff1b; 4.用于发现和定位问…

docker--harbor私有仓库部署与管理

目录 第一章.搭建本地私有仓库 1.1.下载 registry 镜像 1.2.运行 registry 容器 1.3.Docker容器的重启策略如下&#xff1a; 1.4.简单操作 第二章. Harbor 简介 2.1.什么是Harbor 2.2.Harbor的特性 2.3.Harbor的构成 第三章.部署服务 3.1.环境部署 3.2.部署 Docker…

USART串口协议和USART串口外设(USART串口发送串口发送和接收)

1、通信接口 • 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 • 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 异步&#xff1a;需要双方约定一个频率 2、 硬件电路 • 简单双向串口通信有两根通信…

基于springboot和ajax的简单项目 013 ztree插件使用,这是关于修改和新增的

先写写的是menu_list.html文件上的内容。 01.在自动加载函数上写点击事件 $(".input-group-btn").on("click",".btn-delete",doDeleteObject).on("click",".btn-add,.btn-update",doLoadEditUI);02.登录函数&#xff1a; …

30秒预测10天全球天气,上海人工智能实验室发布气象大模型“风乌”效果超DeepMind

4月7日&#xff0c;上海人工智能实验室联合中国科学技术大学、上海交通大学、南京信息工程大学、中国科学院大气物理研究所及上海中心气象台发布全球中期天气预报大模型“风乌”。基于多模态和多任务深度学习方法构建&#xff0c;AI大模型“风乌”首次实现在高分辨率上对核心大…

Speech and Language Processing-导读

朋友们&#xff0c;最近打算做一个大工程&#xff0c;我曾多次提过&#xff0c;chatgpt未来将是一股非常大的信息技术革命&#xff0c;有的人不以为然&#xff0c;或者国内很多企业好像并不是很重视&#xff0c;以我从业多年来的经验&#xff0c;chatgpt与之前的NLP技术有着较为…