洛谷P1039侦探推理题解
#include<cstdio>
#include<cstring>
#include<string>
#include<iostream>
using namespace std;
string s[1005];
int fake[1005];
string name[1005];
string day[10]={"23333333","Today is Monday.","Today is Tuesday.","Today is Wednesday.","Today is Thursday.","Today is Friday.","Today is Saturday."};
int say[1005];
int err;
int pd(int who,int x)
{
if(fake[who]&&fake[who]!=x)err=1;
else fake[who]=x;
}
int main()
{
int n,m,p;
scanf("%d%d%d",&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)say[i]=j;//say[i]=j表示第i句话是j说的
}
getline(cin,s[i]);//把这一行剩下的读进去
s[i].erase(s[i].begin());//把开头的空格去掉?
s[i].erase(s[i].end()-1); //这一句话加上评测A,不加样例本地过。。。
}
int tag=0;
for(int xq=1;xq<=7;xq++)
{
for(int per=1;per<=m;per++)
{
err=0;
memset(fake,0,sizeof(fake));
for(int i=1;i<=p;i++)
{
if(s[i]=="I am guilty.")
{
if(per==say[i])//如果是这个人说自己
{
pd(say[i],1);//是成立的
}
else
{
pd(say[i],-1); //否则不成立
}
}
if(s[i]=="I am not guilty.")
{
if(per!=say[i])//同理
{
pd(say[i],1);
}
else
{
pd(say[i],-1);
}
}
for(int j=1;j<=7;j++)//再枚举一下星期几
{
if(s[i]==day[j])//第i句话说是星期j
{
if(j==xq)//判断是不是这一天
{
pd(say[i],1);
}
else
{
pd(say[i],-1);
}
}
}
for(int j=1;j<=m;j++)
{
if(s[i]==name[j]+" is guilty.")//判断这句话是不是j说的
{
if(per==j)//再判断是不是当前这个人
{
pd(say[i],1);
}
else
{
pd(say[i],-1);
}
}
if(s[i]==name[j]+" is not guilty.")
{
if(per!=j)//同理
{
pd(say[i],1);
}
else
{
pd(say[i],-1);
}
}
}
}
int cnt1=0,cnt2=0;
for(int i=1;i<=m;i++)
{
if(fake[i]==-1)//当前为说假话
{
cnt1++;
}
if(fake[i]==0)//这个人无法判断
{
cnt2++;
}
}
if(err==0&&cnt1<=n&&cnt1+cnt2>=n)//没有矛盾并且说假话的人比n少并且说假话的人加上不确定的人数>=n(确保不确定的人中有说假话的人加上可以达到n
{
if(tag&&tag!=per)//tag有过(保证不是第一个)并且tag和当前的人不是同一个
{
printf("Cannot Determine\n");//说明有多个,输出
return 0;
}
else
{
tag=per;//tag更新一下
}
}
}
}
if(tag==0)//tag始终没更新,找不到凶手了
{
printf("Impossible\n");
return 0;
}
cout<<name[tag];
return 0;
}
洛谷P1039侦探推理题解的更多相关文章
- 洛谷P1039 侦探推理(模拟)
侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...
- 洛谷 P1039侦探推理
/* 枚举罪犯和星期几,那么所有人说的话是真是假一目了然. 首先一个人不能既说真话又说假话. 即: I am guilty. I am not guilty. 因为非真即假,所以直接判断impossi ...
- [NOIP2003] 提高组 洛谷P1039 侦探推理
题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...
- 洛谷 P1039 侦探推理
题目:https://www.luogu.org/problemnew/show/P1039 分析: 这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
随机推荐
- Hadoop 系列(六)—— HDFS 常用 Shell 命令
一.基本命令 打开 Hbase Shell: # hbase shell 1.1 获取帮助 # 获取帮助 help # 获取命令的详细信息 help 'status' 1.2 查看服务器状态 stat ...
- idea常用插件安装
1.IDEA Restart IDEA没有重启的选项,这个工具就是来弥补这个功能,可以在File-->Restart 重启,也可以使用快捷键 CTRL + ALT + R 2.Maven He ...
- 5.安装CentOS后,开机找不到Win10的启动选项解决办法
现象:在Win10下安装了CentOS7双系统,开机后,居然发现找不到Win10启动选项,默认进入了CentOS系统. 解决办法: 方法一:笔者一般是用创建一个Win10启动盘,电脑重启进入启动盘后, ...
- 织梦dedecms是什么?
织梦dedecms是什么?DedeCms是织梦内容管理系统(DedeCms)的简称, 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统; DedeC ...
- Part_three:Redis持久化存储
redis持久化存储 Redis是一种内存型数据库,一旦服务器进程退出,数据库的数据就会丢失,为了解决这个问题,Redis提供了两种持久化的方案,将内存中的数据保存到磁盘中,避免数据的丢失. 1.RD ...
- 【译】Python数据结构
本章将更详细地描述您已经学到的一些内容,并添加了一些新的内容. 5.1 关于列表的更多内容 列表数据类型有一些更多的方法. 以下是列表对象的所有方法: list.append(x) 将项目添加到列表的 ...
- UCOSIII内建消息队列
使能内建消息队列 将OS_CFG_TASK_Q_EN置1 API函数 #if OS_CFG_TASK_Q_EN > 0u //删除 OS_MSG_QTY OSTaskQFlush (OS_TCB ...
- [AIR] NativeExtension在IOS下的开发实例 --- Flex库项目的创建(二)
来源:http://bbs.9ria.com/thread-102038-1-1.html 上一章,我已经介绍了如果创建IOS库文件,并定义了两个方法ShowIconBadageNumber和Init ...
- 【JUC】5.线程池—Executor
创建线程池可以分为三种方式: 1. 通过ThreadPoolExecutor的构造方法,创建ThreadPoolExecutor的对象,即一个线程池对象: 此构造方法,一共7个参数,5个必须参数,2个 ...
- Docker部署Vue
在服务器上创建一个存放该文件的文件夹,将生成的文件上传到这个文件夹下. 上传的同级目录中创建Dockerfile以及nginx.conf两个文件. # 设置基础镜像 FROM nginx # 定义作者 ...