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

news2024/9/22 11:20:40

题目来源于:洛谷

原题点这里

题目本质:模拟,字符串,差分,模拟

题目思路:

记录每一句话是谁说的以及这句话的内容,可以用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) 。

完整代码如下:

#include<bits/stdc++.h>
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];
string s[25], name, a;
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是罪犯
}
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;
}

思路借鉴题解 P1039 【侦探推理】 - 洛谷专栏 (luogu.com.cn)

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

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

相关文章

数据结构与算法1: 链表

基础知识 链表可以被想象为一系列的节点&#xff0c;每个节点至少有一个指针指向下一个节点&#xff0c;在最后一个节点&#xff0c;用null pointer来表示链表的结束。 链表的创建速度通常很快&#xff0c;在表头和表尾的插入也很快&#xff08;O(1)&#xff09;&#xff0c;…

2024年T电梯修理证模拟考试题库及T电梯修理理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年T电梯修理证模拟考试题库及T电梯修理理论考试试题是由安全生产模拟考试一点通提供&#xff0c;T电梯修理证模拟考试题库是根据T电梯修理最新版教材&#xff0c;T电梯修理大纲整理而成&#xff08;含2024年T电梯…

餐饮酒店旅游服务网站整站模板打包下载

餐饮酒店旅游服务网站整站模板打包下载 餐饮酒店旅游服务网站整站模板打包下载 餐饮酒店旅游服务网站整站模板打包下载 餐饮酒店旅游服务网站整站模板打包下载 餐饮酒店旅游服务网站整站模板打包下载 响应式酒店旅租网站模板_餐饮酒店旅游服务类网站整站打包下载.zip 农家…

怎么能实现VIN码充电吗?针对一个单一的VIN码,设置不同的服务费这种计费模式

为了实现VIN码充电并针对单一VIN码设置不同的服务费这种计费模式&#xff0c;需深入了解VIN码充电的实现过程及技术细节。VIN码充电是一种基于车辆识别号码&#xff08;VIN&#xff09;进行充电和计费的方法&#xff0c;适用于新能源汽车的充电桩。具体分析如下&#xff1a; V…

828华为云征文|华为云Flexus X实例docker部署mediacms,功能齐全的现代化开源视频和媒体CMS

828华为云征文&#xff5c;华为云Flexus X实例docker部署mediacms&#xff0c;功能齐全的现代化开源视频和媒体CMS 华为云最近正在举办828 B2B企业节&#xff0c;Flexus X实例的促销力度非常大&#xff0c;特别适合那些对算力性能有高要求的小伙伴。如果你有自建MySQL、Redis、…

时序预测|基于小龙虾优化高斯过程GPR数据回归预测Matlab程序COA-GPR 多特征输入单输出 附赠基础GPR

时序预测|基于小龙虾优化高斯过程GPR数据回归预测Matlab程序COA-GPR 多特征输入单输出 附赠基础GPR 文章目录 一、基本原理二、实验结果三、核心代码四、代码获取五、总结 时序预测|基于小龙虾优化高斯过程GPR数据回归预测Matlab程序COA-GPR 多特征输入单输出 附赠基础GPR 一、…

CMU 10423 Generative AI:lec4(必读:Sliding Window Attention,RoPE, GQA)

lec4有4篇必读文献分别是&#xff1a;Sliding Window Attention&#xff0c;RoPE&#xff0c;GQA&#xff0c;以及花书的CNN第9.1~9.3节。前3个详细研究了一下&#xff0c;如下&#xff1a; 文章目录 1 Sliding Window Attention&#xff08;2020&#xff09;1.1 概览1.2 个人总…

基于Springboot+vue实现的雪具销售系统

作者主页&#xff1a;Java码库 主营内容&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 项目描述 根据日常实际需要&#xff0c;一方面需要在系统中实现基…

基于ESP-IDF的ESP32开发记录——添加多个自己编写的组件

在第一篇的基础上&#xff0c;经过一段时间的学习&#xff0c;看其他人的视频。 ESPIDF的CMAKE其实还有这个特性&#xff1a; 主目录下的CMAKElists文件中&#xff0c;箭头的这句include其实就是帮我们包含了idf目录下的cmake文件&#xff0c;包含了有什么用呢&#xff1f; 其…

Java数组的定义及遍历

数组的声明 长度不能超过定义的长度。超过则会报错通过下标来访问 数组的遍历 最常用最简单的方法是增强for循环。

掌握IC电子元器件海外市场:独立站建设的关键作用

在IC电子元器件领域&#xff0c;由于产品具有较高的特殊性和技术含量&#xff0c;传统的线下交易模式已难以满足市场需求。因此&#xff0c;建立一个专业的IC电子元器件独立站成为了企业进入这一市场的趋势。在IC电子元器件行业中&#xff0c;建设独立站不仅能提供更加个性化的…

Linux日志-日志小结

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux 系统中的日志是记录系统活动和事件的重要工具&#xff0c;它们可以帮助管理员监视系统状态、调查问题以及了解系统运行…

告别繁琐,固乔快递批量查询助手:让物流追踪变得简单

探索固乔科技&#xff0c;您会发现一个强大的工具宝库&#xff0c;其中尤为亮眼的是其快递查询助手软件。这款软件专为高效处理快递信息设计&#xff0c;集成了众多快递公司的接口&#xff0c;实现了一站式查询体验。用户只需简单下载并安装&#xff0c;即可享受其带来的便捷与…

小红书商品详情API:引领电商新时代,精细把控商品呈现革新

一、功能、特点与优势 功能&#xff1a; 小红书商品详情API是一种为开发者提供获取小红书平台上商品详细信息的接口。通过该接口&#xff0c;开发者可以实时获取商品的名称、价格、描述、图片、规格、评论等多维度信息&#xff0c;满足商品展示、信息更新、数据分析等多种需求…

WebAssembly js 调用c++ 高性能传参

WebAssembly js 调用c 高性能传参 通过 Emscripten&#xff0c;你可以直接使用 JavaScript 的 TypedArray 与 C 共享内存&#xff0c; 从而避免频繁的数据拷贝操作。TypedArray 是一种高效的二进制数据表示形式&#xff0c;非常适合处理大规模数值数据。 js 调用&#xff1a; …

二手书回收小程序搭建,体会阅读的魅力

在全民阅读的市场下&#xff0c;书籍的更新速度非常快&#xff0c;也产生了大量闲置书籍&#xff0c;为减少浪费&#xff0c;旧书回收成为了一个两全其美的方式。并且与新书对比&#xff0c;二手书的性价比非常高&#xff0c;大众可以低价购买到喜欢的书。因此&#xff0c;二手…

redis的基础数据结构-list列表

文章目录 1. redis的list数据结构1.1. list结构的特性1.2. 常用命令 2. 常见业务场景2.1 消息队列案例讲解背景优势解决方案代码实现 2.2 排行榜案例讲解背景优势解决方案代码实现 3. 注意事项&#xff1a; 1. redis的list数据结构 参考链接&#xff1a;https://mp.weixin.qq.…

SprinBoot+Vue小区车辆管理系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

国内智能运维厂商月度动态 202408

作为市场人员&#xff0c;虽然也添加了各类行业媒体、同行厂商的关注&#xff0c;但被同事问起业内动向时&#xff0c;常常也是记忆模糊、拍破脑袋也说不完整一件事。 所以找机会翻看了一下各大厂商的公号&#xff0c;先做个简单的8月汇总。 格式暂时是这样的&#xff1a; 整…

SpringBoot2:请求处理原理分析-利用内容协商功能实现接口的两种数据格式(JSON、XML)

文章目录 一、功能说明二、案例实现1、基于请求头实现2、基于请求参数实现 一、功能说明 我们知道&#xff0c;用ResponseBody注解标注的接口&#xff0c;默认返回给页面的是json数据。 其实&#xff0c;也可以返回xml结构的数据给页面。 这一篇就来实现一下这个小功能。 二、…