侦探推理

题目链接

这是一道恶心至极的模拟题

我们可以枚举罪犯是谁,今天是星期几,从而判断每个人说的话是真是假

若每个人说的话的真假一致,且说谎话的人数<=k且说真话的人数<=m-k,就是一个符合的方案

而此题的精髓在于字符串的处理!

要知道每句话的末尾会有一个空格(为此爆到30分)

以及以下坑点:https://www.luogu.org/discuss/show/27320

CENGJINGYOUYIDUANZHENZHIDEGANQINGFANGZAIWOMIANQIANWOMEIYOUZHENXIDENGDAOSHIQULEYIHOUCAIZHUIHUIMOJIRENSHIJIANZUITONGKUDESHIMOGUOYUCIRUGUOSHANGTIANNENGGEIWOYIGEZAILAIYICIDEJIHUIWOHUIDUINAGENVHAIZISHUOSANGEZI:NIMABI !!!

具体看代码吧

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
using namespace std;
#define N 25
int n,m,p,cnt,ans;
map<string,int> M;
struct ZC{
int pos,type,to;
//type 0:罪犯 1:不是罪犯 2:to是罪犯 3:to不是罪犯 4:today是to
} a[N];
string s[N],s1,s2,s3,s4,d1,d2,d3,d4,d5,d6,d7;
int h[N];
int main()
{
s1=" I am guilty.";
s2=" I am not guilty.";
s3=" is guilty.";
s4=" is not guilty.";
d1=" Today is Monday.";
d2=" Today is Tuesday.";
d3=" Today is Wednesday.";
d4=" Today is Thursday.";
d5=" Today is Friday.";
d5=" Today is Saturday.";
d7=" Today is Sunday.";
string x;
scanf("%d%d%d",&m,&n,&p);
getline(cin,x);
for(int i=;i<=m;i++){
cin>>s[i];
M[s[i]]=i;
}
while(p--){
cin>>x;
x.erase(x.end()-);
if(!M[x]){
getline(cin,x);
continue;
}
a[++cnt].pos=M[x];
getline(cin,x);
int it=x.find('.',);
x.erase(it+,x.length()-);
if(x==s1) a[cnt].type=;
else if(x==s2){ a[cnt].type=; }
else if(x==d1){ a[cnt].type=; a[cnt].to=; }
else if(x==d2){ a[cnt].type=; a[cnt].to=; }
else if(x==d3){ a[cnt].type=; a[cnt].to=; }
else if(x==d4){ a[cnt].type=; a[cnt].to=; }
else if(x==d5){ a[cnt].type=; a[cnt].to=; }
else if(x==d6){ a[cnt].type=; a[cnt].to=; }
else if(x==d7){ a[cnt].type=; a[cnt].to=; }
else{
x.erase(,);
int it=x.find(' ',);
string y=x.substr(,it);
x.erase(,it);
if(!M[y]){
cnt--;
continue;
}
a[cnt].to=M[y];
if(x==s3) a[cnt].type=;
else if(x==s4) a[cnt].type=;
else cnt--;
}
}
for(int gu=;gu<=m;gu++){
bool Flag=;
for(int day=;day<=;day++){
memset(h,,sizeof(h));
bool flag=; int tot1=,tot2=;
for(int i=;i<=cnt;i++){
int k;
switch(a[i].type){
case :{
if(a[i].pos==gu) k=;
else k=;
break;
}
case :{
if(a[i].pos!=gu) k=;
else k=;
break;
}
case :{
if(a[i].to==gu) k=;
else k=;
break;
}
case :{
if(a[i].to!=gu) k=;
else k=;
break;
}
case :{
if(a[i].to==day) k=;
else k=;
break;
}
}
if(!h[a[i].pos])
h[a[i].pos]=k;
else if(h[a[i].pos]!=k) flag=;
if(!flag) break;
}
if(!flag) continue;
for(int i=;i<=m;i++)
if(h[i]==) tot1++;
else if(h[i]==) tot2++;
if(tot2<=n&&n<=m-tot1){
Flag=; break;
}
}
if(Flag){
if(ans){
puts("Cannot Determine");
return ;
}
else ans=gu;
}
}
if(ans) cout<<s[ans]<<endl;
else puts("Impossible");
return ;
}
/*
附几个样例
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?? 2 2 4
HELLO
GUILTY
HELLO: What is your name?
GUILTY: I am GUILTY.
GUILTY: Are you guilty?
HELLO: I am not guilty. 5 1 5
A
B
C
D
E
A: Today is Monday.
B: Today is Thursday.
C: Today is Monday.
B: D is not guilty.
E: I am not guilty. */

【洛谷P1039】侦探推理的更多相关文章

  1. 洛谷P1039 侦探推理(模拟)

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

  2. 洛谷 P1039侦探推理

    /* 枚举罪犯和星期几,那么所有人说的话是真是假一目了然. 首先一个人不能既说真话又说假话. 即: I am guilty. I am not guilty. 因为非真即假,所以直接判断impossi ...

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

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

  4. 洛谷 P1039 侦探推理

    题目:https://www.luogu.org/problemnew/show/P1039 分析: 这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪 ...

  5. 洛谷P1039侦探推理题解

    #include<cstdio> #include<cstring> #include<string> #include<iostream> using ...

  6. Luogu P1039 侦探推理(模拟+枚举)

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

  7. P1039 侦探推理(洛谷)

    昨天做了一个非常神奇的题,告诉我们做题之前一定要好好检测评测姬! 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先 ...

  8. P1039 侦探推理

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

  9. LUOGU P1039 侦探推理 (字符串+模拟)

    传送门 解题思路 一道%你神题,\(string\)好强大啊..首先枚举一个周几,再枚举一个罪犯是谁,然后判断的时候就是枚举所有人说的话.定义\(fAKe[i]\)表示第\(i\)个人说的是真话还是假 ...

随机推荐

  1. opensuse 安装oracle 界面乱码

    执行.runInstall时,出现界面乱码 export LANG=en_US export LC_ALL=en_US 终端里 执行这两句.用英文界面安装 再执行 .runInstall

  2. jquery中Ajax提交配合PHP使用的注意事项-编码

    问题:Ajax提交的数据的编码为utf-8,并且返回的数据也要求是utf-8的,如果说你的系统不是utf-8编码的话,那会让你痛不欲生! 解决方法:(比较笨拙的方法,但是很好用) 对于接收的数据,使用 ...

  3. 文档碎片DocumentFragment

    文档碎片是什么? 参考标准的描述,DocumentFragment是一个轻量级的文档对象,能够提取部分文档的树或创建一个新的文档片段,换句话说有文档缓存的作用. createDocumentFragm ...

  4. IntelliJ IDEA 2017.2 下载和破解方法

    一.IntelliJ IDEA 2017 下载地址  http://www.jetbrains.com/idea/#chooseYourEdition 要下载付费版的,免费版的很多功能不能用 二.破解 ...

  5. 用于模式匹配的String方法和RegExp方法

    上一节总结了创建正则表达式的语法,这一篇笔者总结了用于模式匹配的String四个方法:search().replace().match().split()以及用于模式匹配的RegExp两个方法exec ...

  6. git如何进行远程分支切换

    git如何进行远程分支切换 git上查看远程分支命令: git branch -a  例如: 然后我想切换到daily/1.0.0远程分支:前提是必须要创建一个本地分支,并让它和远程分支进行关联,gi ...

  7. Eclipse SWT

    Reference: http://www.eclipse.org/swt/ http://www.functionx.com/win32/Lesson01.htm http://www.win32d ...

  8. 关于scheduleAtFixedRate方法与scheduleWithFixedDelay的使用

    一.scheduleAtFixedRate方法 该方法是ScheduledExecutorService中的方法,用来实现周期性执行给定的任务,public ScheduledFuture<?& ...

  9. 导致SharePoint发生Timeout的几处门槛设置

    IIS connection time-out setting =========================== 如何修改? Click Start, point to All Programs ...

  10. Azure进阶攻略丨Azure网络通不通,PsPing&PaPing告诉你答案

    很多时候,为了解决一些问题,要查各种文档,很麻烦你造吗!做「伸手党」又容易被鄙视,这时候就需要用到[Azure 进阶攻略]啦!特此,我们推出关于 Azure 常用操作指南的系列文章,每篇涉及一个 Az ...