题目

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

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

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

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

输入格式

输入由若干行组成。

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

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

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

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

输出格式

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

输入输出样例

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

对于 100\%100% 数据,满足 1\le M\le 201≤M≤20,1\le N\le M1≤N≤M,1\le P\le 1001≤P≤100。

1、根据题意可知可以利用枚举法完成。枚举罪犯和今天是星期几。满足N个人始终说谎话和M-N个人始终说真话的条件,就可以确定罪犯。

2、首先利用字符串操作将证言转化成计算机可表示的信息。

1)定义

Guilty:Array[1..MM,1..MM] Of Integer;{-1..1}

FillChar(Guilty,SizeOf(Guilty),0)

初值为0

Guilty[i,j]=-1:表示第i个人说第j个人不是罪犯

Guilty[i,j]= 1:表示第i个人说第j个人是罪犯

其中包含Guilty[i,i]即第i个人说自己是不是罪犯

注意:Guilty不可以自相矛盾。

2)定义

WhatDay:Array[1..MM,1..7] Of Boolean;

FillChar(WhatDay,SizeOf(WhatDay),False)

WhatDay[i,j]:=True :表示第i个人说过j是星期几

3、枚举罪犯和星期几,判断每句证言是真是假,统计说真假证言的人数。

注意:有可能某人又说过真话,又说过假话。

4、根据题目要求输出罪犯编号或Cannot Determine或Impossible。

代码:

#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int n,m,p,fake[21],err,w[200],nx;
string name[100],say[200];
string day[10]={"233","Today is Sunday.","Today is Monday.","Today is Tuesday.","Today is Wednesday.","Today is Thursday.","Today is Friday.","Today is Saturday.",};
void set(int who,int yx){//err是错误标记,如果一个人既说真话又说假话显然是不吼滴 if(fake[who]&&fake[who]!=yx)err=1;else fake[who]=yx;
}
int main(){cin>>m>>n>>p;for(int i=1;i<=m;i++)cin>>name[i];for(int i=1;i<=p;i++){string nm;cin>>nm;//输入这句话是谁说的 nm.erase(nm.end()-1);//把冒号搞掉 for(int j=1;j<=m;j++)if(name[j]==nm)w[i]=j; //判断这句话是谁说的getline(cin,say[i]);say[i].erase(say[i].begin());//把空格搞掉 // say[i].erase(say[i].end()-1);//把换行符去掉,上一行注释如果不去掉自己电脑能过,去掉评测能过。。。 }for(int td=1;td<=7;td++)//枚举今天是星期几 for(int px=1;px<=m;px++){//枚举罪犯是谁 //清除标记 err=0;memset(fake,0,sizeof(fake)); for(int i=1;i<=p;i++){//依次判断每句话 int who=w[i];if(say[i]=="I am guilty.")set(who,px==who?1:-1);//如果一个人是罪犯,而且说自己是罪犯,那他说的就是真话,否则就是假话 if(say[i]=="I am not guilty.")set(who,px!=who?1:-1);//如果一个人不是罪犯,而且说自己不是罪犯,那他说的就是真话,否则就是假话 for(int j=1;j<=7;j++)if(say[i]==day[j])set(who,j==td?1:-1);//如果一个人说今天是星期几,说对了就是真话,说错了就是假话 for(int j=1;j<=m;j++){if(say[i]==name[j]+" is guilty.")set(who,j==px?1:-1);if(say[i]==name[j]+" is not guilty.")set(who,j!=px?1:-1);//显然说对了就是真话,否则就是假话 }}int cnt=0,ppp=0;//cnt:说假话的人数,ppp:不确定的人数 for(int i=1;i<=m;i++){if(fake[i]==-1)cnt++;if(fake[i]==0)ppp++;}if(!err&&cnt<=n&&cnt+ppp>=n)// 如果cnt<=n<=cnt+ppp,就说明这个假设合理 //如果出现Impossible的情况,怎么枚举都会err,这里直接跳过就行了 if(nx&&nx!=px){//出现了两个合理的罪犯 cout<<"Cannot Determine";return 0;}else nx=px;}if(!nx)cout<<"Impossible"; else cout<<name[nx];
}

P1039 [NOIP2003 提高组] 侦探推理相关推荐

  1. vijos 1106 NOIP2003 提高组 侦探推理 题解

    [原题] P1106侦探推理 Accepted 标签: [显示标签] 描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明 ...

  2. [NOIP2003提高组]侦探推理

    题目:洛谷P1039.Vijos P1106.codevs1089. 题目大意:给你一系列证词,要你求出谁是凶手.具体题目见原题. 解题思路:我们枚举犯人和星期,一个一个进行判断.如果成功则记录答案, ...

  3. NOIP2003提高组

    第一题 神经网络 [题目描述] 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神 ...

  4. P1041 [NOIP2003 提高组] 传染病控制

    题目背景 本题是错题,后来被证明没有靠谱的多项式复杂度的做法.测试数据非常的水,各种玄学做法都可以通过,不代表算法正确.因此本题题目和数据仅供参考. 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感 ...

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

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  6. NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)

    尼玛!!我做完这道题整个人都不淡定了好不!!!! 题目大意:给定m个人,其中n个人在说谎,给出这m个人的p句话,找出凶手 我不是来发题解的!这题就是水题!我是来吐槽数据的!!!! 首先让我们来看这句话 ...

  7. [NOIP2003] 提高组 洛谷P1041 传染病控制

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  8. NOIP1998-2018 CSP-S2 2019 2021提高组解题报告与视频

    CSP-S 2020 讲题录屏 CSP-S 2020 讲题录屏_哔哩哔哩_bilibili 冠军说题--ACM世界冠军吴卓杰,带你复盘2020 CSP-S2 冠军说题--ACM世界冠军吴卓杰,带你复盘 ...

  9. noip2003 侦探推理 (字符串处理)

    P1106侦探推理 Accepted 标签:字符串模拟NOIP提高组2003 描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样 ...

最新文章

  1. 区块链时代的拜占庭容错:Tendermint(四)
  2. SuperCMS 上传漏洞!
  3. python modbus tk 库_如何使用modbus tk rtu(python)设置简单的从机和主机
  4. ubuntu dpkg initramfs-tools错误的解决方法
  5. RGB转YUV 各种库的性能比较
  6. 蓝桥杯-最大的算式(java)
  7. 从fread和mmap 谈读文件的性能
  8. skip与direct模式区别 ,他们与CBP的关系
  9. 不可错过!斯坦福课程3D数据的机器学习方法(Machine Learning for 3D Data)第一部分
  10. 20181030函数2
  11. 转自 方倍工作室微信公众平台开发
  12. Pspice仿真实验B-2
  13. 如何在ppt中生成柱状图_在PPT中怎么制作图表?PPT制作图表的方法
  14. 软件暴力破解的原理和破解经验
  15. TSFS终端存储文件系统边缘计算项目介绍-海洋
  16. PX4从放弃到精通(二十七):固定翼姿态控制
  17. 炫舞服务器显示方框怎么回事,win10界面全是显示方块如何解决_win10系统界面出现白色方框该怎么去除-win7之家...
  18. python fabs() 函数
  19. RK3399 / AR9201 / Tegra K1 /hi3559A / RV1126对比
  20. 计算机专业退休有退休金,那些专业有退休金 哪个行业的退休金最多?

热门文章

  1. matlab之运动目标检测
  2. c盘users在哪(c盘users在哪)
  3. C++ ERROR:error: passing 'XXX' as 'this' argument of 'XXX' discards qualifiers
  4. 系统重构的原则代码重构的原则
  5. 中国成语测试软件,中国汉字水平测试
  6. java int格式转换文本_java 文件导出Excel 文本形式转数字格式解决,字段是int导出需求是数字解决方案...
  7. 苹果手机怎么连接蓝牙耳机_「科技犬」除了苹果AirPods,真无线蓝牙耳机到底怎么选?_蓝牙耳机...
  8. 十款常用Linux系统介绍
  9. 高考,高中毕业之后,这人世间,又多了一只闲云野鹤
  10. 事件触发控制 Event-Trigger Control Matlab Code