P1039 [NOIP2003 提高组] 侦探推理

注意换行符!!!

如果你使用getchar()系列函数读入,并且用换行符判定是否结束,则换行符会导致你WA掉!

linux下换行符为’\n’,windows下换行符为’\r\n’,如果数据是windows下造的,你就把’\r’也给当成字符串内容了,不wa才怪。

所以,你可以选择建立一个缓存区,把所有的’\r’替换成’\n’,进行计算。

读取一整行的方法:

fgets(char* dst,size_t buf_size,File* file)
最后一个参数传stdin即可。不要用scanf(“%[^\n]”,str),因为你不知道最后的换行符是啥!

另外为了预防文末没换行的情况,手动在缓存区末补上一个’\n’。

具体算法不多说了,先预处理出每个人表示的意思,然后二进制状压枚举撒谎的人,如果这个状态的大小与所给人数相同,则进行计算。记得判定矛盾。可能这个状态是互相矛盾的,则不应更新答案。

如果输入存在矛盾,直接输出impossible。

如果一个状态有多个人未知,且没有人必定为罪犯则多解。

如果多个状态推出不同的罪犯,则多解。

如果一个状态只有一个人未知,其余的人都一定不是罪犯,则用这个不确定的人是罪犯去更新答案。

最后数一下有多少个人可能是罪犯,统计size,如果size为0则输出impossible,为1则输出人名,其余情况输出多解。
最后上代码:

#include<bits/stdc++.h>
#define debug cout
using namespace std;
const int maxn=30;
string name[maxn];
int ptr[maxn][maxn]; // 1 means is , -1 means not;
int day[maxn]; // means says day.
int day_can_be[maxn]; // can be that day ? 1 means is , -1 means is not.
int gul_can_be[maxn]; // persob i can be guilty or not , 1 means is , -1 means is not;
int may_be_ans[maxn]; // 0,1 means can be answer or not
string buf[1<<10];
map<string,int> person;
int n,m,p,mx,cnt,ans;
inline int getdate(string x)
{if(x=="monday.") return 1;if(x=="tuesday.") return 2;if(x=="wednesday.") return 3;if(x=="thursday.") return 4;if(x=="friday.") return 5;if(x=="saturday.") return 6;if(x=="sunday.") return 7;return puts("Wrong spelling ! Fuck you!"),-1;
}
inline char convchar(char x)
{if( x>='A' && x<='Z' )return x-'A'+'a';else return x;
}
inline void convstring(string &x)
{for(unsigned i=0;i<x.length();i++)x[i] = convchar(x[i]);
}
inline char nextchar(int arg=0)
{static char buf[1<<10],*st;if(arg){fgets(buf,1<<10,stdin),st=buf;int i;for(i=0;i<1<<10&&buf[i];i++)if( buf[i]=='\r' )buf[i] = '\n';buf[i] = '\n';}return *st++;
}
inline void getline()
{cnt = 0;char c=nextchar(1);cnt = 1;while( c != '\n' ){if(c==' '){if( person.find(buf[cnt]) == person.end() )convstring(buf[cnt]);cnt++;}elsebuf[cnt] = buf[cnt] + c;c = nextchar();}while( buf[cnt]=="" ) cnt--;convstring(buf[cnt]);
}
inline void resbuf()
{for(int i=1;i<=cnt;i++)buf[i].clear(),buf[i].resize(0);
}
inline void explain()
{if( buf[2]!="i" && buf[2]!="today" && person.find(buf[2])==person.end() ) return;const int id = person[buf[1]];if( buf[2]=="today" ){int dd = getdate(buf[4]);if( day[id] && day[id]!=dd ){ans = -2;return;}day[id] = dd;}else if( buf[4]=="guilty." ){int tar = buf[2]=="i" ? id : person[buf[2]];if( ptr[id][tar] && ptr[id][tar]!=1 ){ans = -2;return;}ptr[id][tar] = 1;}else if( buf[5]=="guilty." ){int tar = buf[2]=="i" ? id : person[buf[2]];if( ptr[id][tar] && ptr[id][tar]!=-1 ){ans = -2;return;}ptr[id][tar] = -1;}
}
inline void reslogic()
{memset(day_can_be,0,sizeof(day_can_be));memset(gul_can_be,0,sizeof(gul_can_be));
}
inline void logic(int x,int mul,int& flag)
{if(day[x]){if( day_can_be[day[x]] && day_can_be[day[x]]!=mul ){flag=0;return;}day_can_be[day[x]] = mul;}for(int i=1;i<=n;i++)if(ptr[x][i]){const int pp = ptr[x][i]*mul;if( gul_can_be[i] && gul_can_be[i]!=pp ){flag = 0;return;}gul_can_be[i] = pp;}
}
inline bool judgedate()
{int ret=0;for(int i=1;i<=7;i++)if( ~day_can_be[i] )ret += day_can_be[i];return ret<2;
}
inline void judgegul()
{int pos = -1,siz=n;for(int i=1;i<=n;i++){if( !~gul_can_be[i] ) --siz;else if( gul_can_be[i] == 1 ){pos = i;break;}}if( siz>1 && !~pos ) // can not determine , maybe multi guilty .{ans = -1;return;}if( siz==1 && !~pos )for(int i=1;i<=n;i++)if( !gul_can_be[i] ){may_be_ans[i] = 1;return;}for(int i=1;i<=n;i++)if( i!=pos && gul_can_be[i] == 1 ) // must be multi guilty in this statementreturn;may_be_ans[pos] = 1;
}
inline int count(int x)
{int ret=0;while(x)ret++,x -= (x&-x);return ret;
}
inline int getans()
{int ret = 0;for(int i=1;i<=n;i++)if( may_be_ans[i] )ret++,ans = i;return ret;
}
int main()
{scanf("%d%d%d",&n,&m,&p);mx = (1<<n);for(int i=1;i<=n;i++){cin>>name[i];person[name[i]] = person[name[i]+":"] = i;}char c = nextchar(1);while(c!='\n') c=nextchar();for(int i=1;i<=p;i++){resbuf();getline();explain();}if( ans == -2 )return puts("Impossible"),0;for(int s=0;s<mx;s++){if( count(s) != m ) continue;reslogic();int flag =1;for(int i=1;i<=n&&flag;i++)if( s & (1<<(i-1)) )logic(i,-1,flag);else logic(i,1,flag);if( flag && judgedate() )judgegul();}if( !~ans )return puts("Cannot Determine"),0;if( !getans() )return puts("Impossible"),0;if( getans() > 1 )return puts("Cannot Determine"),0;cout<<name[ans]<<endl;return 0;
}

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

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

相关文章

单片机小项目——直流电机+按键

利用普中单片机的代码实现在按下第k个独立按键时&#xff0c;直流电机运作k秒 #include "reg52.h"typedef unsigned int u16; //对系统默认数据类型进行重定义 typedef unsigned char u8; sbit DC_MotorP1^0; //定义独立按键控制脚 sbit KEY1P3^1; sbit KEY2P3^0; sb…

代码学习记录45---单调栈

随想录日记part45 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.04.17 主要内容&#xff1a;今天开始要学习单调栈的相关知识了&#xff0c;今天的内容主要涉及&#xff1a;每日温度 &#xff1b;下一个更大元素 I 739. 每日温度 496.下一个更大元素 I Topic…

【力扣】55. 跳跃游戏 - 力扣(LeetCode)

Problem: 55. 跳跃游戏 记录自己解答的思路和代码 文章目录 问题思路复杂度Code 问题 思路 这个题的主要思路就是先找到0对应的位置&#xff0c;然后标记起来对应left&#xff0c;如果只有一个零&#xff0c;只需要left后面的数中有>1的数就能跳过去&#xff0c;如果是00&a…

静态成员与友元,内部类初识

一.静态成员 1.静态成员变量 &#xff08;1&#xff09;定义&#xff1a; 类的定义中以静态声明的变量 &#xff08;2&#xff09;写法&#xff1a; static 变量声明 &#xff08;3&#xff09;注意&#xff1a; 静态成员变量不在对象中&#xff0c;在静态区&#xff0c…

ROS仿真小车(二)——添加摄像头雷达传感器

文章目录 前言一、在 Rviz 中显示一个盒状机器人1.1 创建ROS功能包1.2 在 launch 文件中集成 URDF 与 Rviz1.3 在 Rviz 中显示机器人模型1.4 优化 rviz 启动 二、创建一个四轮圆柱状机器人模型2.1 配置urdf和launch文件2.2 URDF优化_xacro2.2.1 配置xacro文件2.2.2 编写 Xacro …

深度学习:Pytorch分布式训练

深度学习&#xff1a;Pytorch分布式训练 简介模型并行数据并行参考文献 简介 在深度学习领域&#xff0c;模型越来越庞大、数据量不断增加&#xff0c;训练这些大型模型越来越耗时。通过在多个GPU或多个节点上并行地训练模型&#xff0c;我们可以显著减少训练时间。此外&#…

【Canvas与艺术】绘制黑白山间野营Camping徽章

【说明】 中间的山月图是借用的网上的成图&#xff0c;不是用Canvas绘制的。 【成果图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head>…

Ocr识别

https://blog.csdn.net/qq_47571357/article/details/132017514 Tesserocr 的安装 https://cuiqingcai.com/31102.html https://digi.bib.uni-mannheim.de/tesseract/ https://zhuanlan.zhihu.com/p/642903270 https://segmentfault.com/a/1190000039929696

fdisk使用的MBR分区

MBR和GPT分区 MBR分区 MBR分区一般在分区的时候 &#xff0c;MBR分区格式只能支持2TB以下的硬盘容量。 分区最多为4个主分区 或 3个主分区和1个扩展分区&#xff0c;而创建扩展分区后可以分无数个逻辑分区&#xff0c;当然跟磁盘容量有关&#xff0c; 逻辑分区在扩展分区上…

Windows 下 bat 脚本调用 Git bash 环境 sh 脚本

1、先找到 Git 安装目录 D:\Install\Git 2、Git bash 编写 sh 脚本 start.sh脚本 3、编写 start.bat脚本 echo offcd /d %~dp0 "D:\Install\Git\bin\sh.exe" --login -i -c "./test/start.sh"pause4、执行 bat 脚本 双击 start.bat 我们下期见&#xf…

运算符介绍

运算符介绍 运算符是一种特殊的符号&#xff0c; 用以表示数据的运算、 赋值和比较等。 算术运算符赋值运算符关系运算符 [比较运算符]逻辑运算符位运算符 [需要二进制基础]三元运算符 算术运算符 算术运算符是对数值类型的变量进行运算的&#xff0c; 在 Java 程序中使用的…

Meta Llama 3 简介

文章目录 要点我们对 Llama 3 的目标最先进的性能模型架构训练数据扩大预训练规模指令微调与 Llama 3 一起建造系统级责任方法大规模部署 Llama 3Llama 3 的下一步是什么&#xff1f;立即尝试 Meta Llama 3 本文翻译自&#xff1a;https://ai.meta.com/blog/meta-llama-3/ 要点…

vue实现文字转语音的组件,class类封装,实现项目介绍文字播放,不需安装任何包和插件(2024-04-17)

1、项目界面截图 2、封装class类方法&#xff08;实例化调用&#xff09; // 语音播报的函数 export default class SpeakVoice {constructor(vm, config) {let that thisthat._vm vmthat.config {text: 春江潮水连海平&#xff0c;海上明月共潮生。滟滟随波千万里&#xf…

Android Gradle插件对应的Gradle脚本所需版本

gradle/wrapper目录 gradle-wrapper.properties 文件对应的是脚本版本 distributionUrlhttps\://services.gradle.org/distributions/gradle-7.5-bin.zip根目录中 build.gradle 文件中 对应的 插件版本 如 7.4.2 buildscript {ext.kotlin_version 1.7.0dependencies {classp…

5G网络架构;6G网络架构

目录 5G和6G架构 6G网络架构 5G和6G架构 在设计和功能上有显著的区别,这主要体现在它们各自的核心特点、优势和应用场景上。 5G技术架构的核心特点包括高速率与低延迟、大容量与高密度以及网络切片。高速率与低延迟极大地提升了用户体验,支持更多实时应用和大规模数据传输…

PS-ZB转座子分析流程2-重新分析并总结

数据处理 数据质控 随机挑出九个序列进行比对&#xff0c;结果如下&#xff1a; 所有序列前面的部分序列均完全相同&#xff0c;怀疑是插入的转座子序列&#xff0c;再随机挑选9个序列进行比对&#xff0c;结果如下&#xff1a; 结果相同&#xff0c;使用cutadapt将该段序列修…

mybatis(5)参数处理+语句查询

参数处理&#xff0b;语句查询 1、简单单个参数2、Map参数3、实体类参数4、多参数5、Param注解6、语句查询6.1 返回一个实体类对象6.2 返回多个实体类对象 List<>6.3 返回一个Map对象6.4 返回多个Map对象 List<Map>6.5 返回一个大Map6.6 结果映射6.6.1 使用resultM…

Windows10安装配置nodejs环境

一、下载 下载地址&#xff1a;https://nodejs.cn/download/ ​ 二、安装 1、找到node-v16.17.0-x64.msi安装包, 根据默认提示安装, 过程中间的弹窗不勾选 2、安装完成后, 打开powershell(管理员身份) ​ 3、命令行输入 node -v 和 npm -v 如下图所示则nodejs安装成功 ​ 三…

A27 STM32_HAL库函数 之 IRDA通用驱动 -- B -- 所有函数的介绍及使用

A27 STM32_HAL库函数 之 IRDA通用驱动 -- B -- 所有函数的介绍及使用 1 该驱动函数预览1.11 HAL_IRDA_DMAPause1.12 HAL_IRDA_DMAResume1.13 HAL_IRDA_DMAStop1.14 HAL_IRDA_Abort1.15 HAL_IRDA_AbortTransmit1.16 HAL_IRDA_AbortReceive1.17 HAL_IRDA_Abort_IT1.18 HAL_IRDA_A…

JavaScript Promise与async/await

Promise与async/await 为什么要使用他们如何使用.then() 和.catch()如何将相同的代码转换成sync和Await关键字 为什么要使用他们 前面学习了JavaScript的简单类型&#xff08;例如 数字和字符串&#xff09;&#xff0c;我们的代码会按顺序从上往下执行 console.log(1111); c…