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

来源:互联网 发布:淘宝网哪家手机店靠谱 编辑:程序博客网 时间:2024/05/01 11:05

【原题】

P1106侦探推理
Accepted
标签:[显示标签]

描述

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

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

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

格式

输入格式

输入由若干行组成,第一行有二个整数,M(1≤M≤20)、N(1≤N≤M)和P(1≤P≤100);M是参加游戏的明明的同学数,N是其中始终说谎的人数,P是证言的总数。接下来M行,每行是明明的一个同学的名字(英文字母组成,没有主格,全部大写)。往后有P行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。证词每行不会超过250个字符。

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

输出格式

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

样例1

样例输入1[复制]

3 1 5MIKECHARLESKATEMIKE:I am guilty.MIKE:Today is Sunday.CHARLES:MIKE is guilty.KATE:I am guilty.KATE:How are you??

样例输出1[复制]

MIKE

限制

每个测试点1s

提示

有说一句话的末尾无空格的么?..

来源

NOIP2003第二题

【分析】神题刷的太多了,感觉怪怪的。如果再没有水题来调节,真的是浑身不爽!。然后就滚粗去VJ水了一道码农题。感觉思路还是比较简洁的,初步缩行后(这样更美观吧)才69行。人名可以用MAP来搞搞。

讲一下思路。开始很傻×的认为去C(20,10)枚举每个人是否讲假话。这个的时间效率。。。后来发现,只要枚举了罪犯和今天是星期几,很容易判断每个人是否讲假话,然后看看人数是否是给定的数目就行了。

读入要注意一下。开始我被样例坑了,以为冒号后面就没有空格,觉得超麻烦:我如果把每句话的每个单词都截取出来,第一个单词还要分冒号~~交了后WA了,才在输入格式里发现有空格。。。不是更水吗?

然后判断5句话的话,我把1,2两句和3,4两句结合在了一起判断,更省代码和思维。

还有一个值得注意的地方就是:有些人可能不说真话也不说假话(就是说的是那种无关紧要的话),我们可以算作真话,也可以算作假话,主要是为了更靠近答案。

对了,对于名字的字符串要开的大一点。我记得最后一个点的名字有很长的一串,然后我就直接爆了。

【代码】

#include<cstdio>#include<cstring>#include<map>#include<string>using namespace std;map<string,int>Map;char s[105][25][525],name[105][525],ans[105][525],a[25][525];int num[105],f[25],n,m,i,j,k,P,Today,flag,now,lie,Len,cnt,T;char day[8][25]={"","Monday.","Tuesday.","Wednesday.","Thursday.","Friday.","Saturday.","Sunday."};inline int equal(char *s1,char *s2){  int l1=strlen(s1),l2=strlen(s2);if (l1!=l2) return 0;  for (int i=0;i<l1;i++) if (s1[i]!=s2[i]) return 0;return 1;}inline int check_1(int k){  if (!equal(s[k][num[k]],"guilty.")||num[k]<3||num[k]>4) return 2;  if (s[k][1][0]!='I'||s[k][1][1]!='\0'||!equal(s[k][2],"am")) return 2;  if (num[k]==4) if (!equal(s[k][3],"not")) return 2;  if (Map[name[k]]==now) {if (num[k]==3) return 0;return 1;}  if (num[k]==3) return 1;return 0;}inline int check_2(int k){  if (!equal(s[k][num[k]],"guilty.")||num[k]<3||num[k]>4) return 2;  if (!equal(s[k][2],"is")) return 2;  if (num[k]==4) if (!equal(s[k][3],"not")) return 2;  if (Map[s[k][1]]==now) {if (num[k]==3) return 0;return 1;}  if (num[k]==3) return 1;return 0;}inline int check_3(int k){  if (num[k]!=3||!equal(s[k][1],"Today")||!equal(s[k][2],"is")) return 2;  return equal(day[Today],s[k][3])^1;}inline int work(){  now=Map[a[P]];int res=0,another=0;memset(f,0,sizeof(f));  for (int i=1;i<=m;i++)  {    int T1=check_1(i),T2=check_2(i),T3=check_3(i),pre=Map[name[i]];    if (!T1||!T2||!T3) {if (f[pre]==2) return 0;f[pre]=1;}    if (T1&1||T2&1||T3&1) {if (f[pre]==1) return 0;f[pre]=2;}  }  for (int i=1;i<=n;i++)    if (f[i]==2) res++;else if (!f[i]) another++;  return (res<=lie&&res+another>=lie);}inline int OK(char ch){return (ch>='A'&&ch<='Z'||ch>='a'&&ch<='z');}int main(){  scanf("%d%d%d",&n,&lie,&m);  for (i=1;i<=n;i++) scanf("%s",a[i]),Map[a[i]]=i;  for (i=1;i<=m;i++)   {    scanf("%s",name[i]);name[i][strlen(name[i])-1]='\0';    scanf("%s",s[i][num[i]=1]);    while (OK(s[i][num[i]][strlen(s[i][num[i]])-1])) scanf("%s",s[i][++num[i]]);  }  for (P=1;P<=n;P++)  {    flag=0;for (Today=1;Today<=7&&!flag;Today++) flag=work();    if (flag) memcpy(ans[++cnt],a[P],sizeof(a[P]));  }  if (!cnt) printf("Impossible");  else if (cnt==1) printf("%s",ans[cnt]);  else printf("Cannot Determine");  return 0;}

0 2
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 电脑内存性能低怎么办 nas硬盘坏了怎么办 360安装环境异常怎么办 连接不上服务器怎么办 路由器被绑定mac怎么办 mac地址绑定失败怎么办 触摸屏忘了密码怎么办? 小区高层水压低怎么办 高层楼房水压不够怎么办 热水器温度太高怎么办 热水器出热水小怎么办 天然气热水器水压不够怎么办 热水器水变小了怎么办 液压齿轮泵没力怎么办 gps总是浮点解怎么办 电源要做到稳压怎么办 变压器输出电压低怎么办 变压器输出电压高怎么办 家里空调带不动怎么办 小天才定位不准怎么办 伐木锯链条不出油怎么办 角磨机切割片卸不下来怎么办 油泵电机声音大怎么办 汽车油泵声音大怎么办 水泵电机噪音大怎么办 注塑机油泵超载怎么办 模具老是粘模怎么办 打印机提示卡纸2怎么办 扬子空调显示e9怎么办 供应商不配合售后怎么办? 数控车床显示屏不亮怎么办? 西威变频器过载怎么办 vgm申报错了怎么办 老公常年不回家怎么办 狗对主人龇牙怎么办 酒喝多了会尿床怎么办 6岁儿童尿床怎么办 遇到耍酒疯的人怎么办 老公喝完酒尿床怎么办 尿不尽影响睡觉怎么办 大便次数较多怎么办