LUOGU P1039 侦探推理 (字符串+模拟)
解题思路
一道%你神题,\(string\)好强大啊。。首先枚举一个周几,再枚举一个罪犯是谁,然后判断的时候就是枚举所有人说的话。定义\(fAKe[i]\)表示第\(i\)个人说的是真话还是假话还是未知。然后如果遇到\(xx is guilty\)或\(I am guilty\)之类的话,就看枚举的罪犯是否为这个人。如果说的是\(Today is xxx\),就看当前枚举的星期是否为这一天。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<string>
#include<map>
using namespace std;
const int MAXN = 25;
int n,m,p,fAKe[MAXN],w[205],ans,now,err;
string name[MAXN],say[205];
string day[10]={"","Today is Sunday.","Today is Monday.","Today is Tuesday.","Today is Wednesday."
,"Today is Thursday.","Today is Friday.","Today is Saturday."};
map<string,int> mp;
void solve(int x,int y){
if(!fAKe[x]) fAKe[x]=y;
else if(fAKe[x] && fAKe[x]!=y) err=1;
}
int main(){
scanf("%d%d%d",&m,&n,&p);
for(int i=1;i<=m;i++) cin>>name[i],mp[name[i]]=i;
for(int i=1;i<=p;i++){
string nm;cin>>nm;
nm.erase(nm.end()-1);w[i]=mp[nm];
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 chp=1;chp<=m;chp++){ //枚举罪犯
err=0;int who,cnt,pp;
memset(fAKe,0,sizeof(fAKe));
for(int i=1;i<=p;i++){
who=w[i];
if(say[i]=="I am guilty.") solve(who,who==chp?1:-1);
if(say[i]=="I am not guilty.") solve(who,who==chp?-1:1);
for(int j=1;j<=7;j++)
if(say[i]==day[j]) {solve(who,j==td?1:-1);break;}
for(int j=1;j<=m;j++){
if(say[i]==name[j]+" is guilty.") solve(who,chp==j?1:-1);
if(say[i]==name[j]+" is not guilty.") solve(who,chp==j?-1:1);
}
}
cnt=pp=0;
for(int i=1;i<=m;i++) {
if(!fAKe[i]) pp++;
if(fAKe[i]==-1) cnt++;
}
if(err || cnt>n || cnt+pp<n) continue;
if(ans && ans!=chp) {
puts("Cannot Determine");
return 0;
}
ans=chp;
}
if(ans) cout<<name[ans];
else puts("Impossible");
return 0;
}
LUOGU P1039 侦探推理 (字符串+模拟)的更多相关文章
- Luogu P1039 侦探推理(模拟+枚举)
P1039 侦探推理 题意 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯 ...
- 洛谷P1039 侦探推理(模拟)
侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...
- P1039 侦探推理
题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...
- [NOIP2003] 提高组 洛谷P1039 侦探推理
题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...
- 洛谷 P1039 侦探推理
题目:https://www.luogu.org/problemnew/show/P1039 分析: 这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪 ...
- P1039 侦探推理(洛谷)
昨天做了一个非常神奇的题,告诉我们做题之前一定要好好检测评测姬! 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先 ...
- 洛谷 P1039侦探推理
/* 枚举罪犯和星期几,那么所有人说的话是真是假一目了然. 首先一个人不能既说真话又说假话. 即: I am guilty. I am not guilty. 因为非真即假,所以直接判断impossi ...
- 洛谷P1039侦探推理题解
#include<cstdio> #include<cstring> #include<string> #include<iostream> using ...
- 【洛谷P1039】侦探推理
侦探推理 题目链接 这是一道恶心至极的模拟题 我们可以枚举罪犯是谁,今天是星期几,从而判断每个人说的话是真是假 若每个人说的话的真假一致,且说谎话的人数<=k且说真话的人数<=m-k,就是 ...
随机推荐
- Flyway 学习时遇到的错误
错误一: No plugin found for prefix 'flyway' in the current project and in the plugin groups 找不到Flyway插 ...
- zero udp
Description UDP transport can only be used with the ZMQ_RADIO and ZMQ_DISH socket types.
- K-mean matlab 实现代码
一.K均值聚类算法 算法步骤如下: 1.初始化 已知数据集合X,及事先指定聚类的总类数N,在X中随机选取N个对象作为初始的聚类中心. 2.设定迭代终止条件 通常设置最大循环次数或者聚类中心的变化误差. ...
- node 模板引擎使用的步奏
//定义模板引擎 app.engine('html',swig.renderFile);//设置模板引擎所存放的位置app.set('views','/views');//注册所使用的模板引擎app. ...
- Java语法清单-快速回顾(开发)
Java CheatSheet 01.基础 hello,world! public static void main(String[] args) { System.out.println(" ...
- NOIp2018集训test-9-23
这个NOI模拟题怕是比你们的NOIp模拟题要简单哦.. 友好的生物 应该是一道简单题,但是机房只有辉神一个人想到正解似乎. 被我kd-tree水过去了(这不是kd-tree的裸题吗???(不是)) / ...
- [JZOJ 5813] 计算
题意:求满足题意的方案数. 思路: 显然的计数类\(dp\). 不难发现,令$f(x) = \prod_{i=1}^{2m}{x_i} \(. 在找一个\)x'\(使得\)f(x') = \prod_ ...
- Java-Class-@I:org.springframework.web.bind.annotation.RestController
ylbtech-Java-Class-@I:org.springframework.web.bind.annotation.RestController 1.返回顶部 2.返回顶部 1. pack ...
- Openstack Paste.ini 文件详解
目录 目录 pasteini 配置文件详解 composite pipeline filter app DEFAULT server Request 被 pasteini 处理的流程 如何加载 pas ...
- c++11新特性学习2
noexcept 替代 throw.优点是更安全, 如果noexcept 修饰的函数抛出了异常,编辑器可以直接选择终止程序. C++ 11中析构函数默认为noexcept(true),从而阻止异常的扩 ...