信息学奥赛试题里也有柯南
N0IP2003提高组试题题二 侦探推理
【问题描述】
明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:
I am guilty.
I am not guilty.
XXX am guilty.
XXX am not guilty.
Today is XXX.
证词中出现的其他话,都不列入逻辑推理的内容。
明明所知道的是,他的同学中有 N 个人始终说假话,其余的人始终说真。
现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住, 凶手只有一个!
【输入格式】
输入由若干行组成,第一行有二个整数, M ( 1≤M≤20 )、 N ( 1≤N≤M )和 P ( 1≤P≤100 );
M 是参加游戏的明明的同学数, N 是其中始终说谎的人数, P 是证言的总数。接下来 M 行,
每行是明明的一个同学的名字(英文字母组成,没有主格,全部大写)。
往后有 P 行,每行开始是某个同学的名宇,紧跟着一个冒号和一个空格,后面是一句证词,符合前表中所列格式。证词每行不会超过 250 个字符。
输入中不会出现连续的两个空格,而且每行开头和结尾也没有空格。
【输出格式】
如果你的程序能确定谁是罪犯,则输出他的名字;如果程序判断出不止一个人可能是罪犯,则输出 Cannot Determine ;如果程序判断出没有人可能成为罪犯,则输出 Impossible 。
【输入样例】
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??
【输出样例】
MIKE
回复: 信息学奥赛试题里也有柯南
大概能看懂,汗一个回复: 信息学奥赛试题里也有柯南
罪犯要是都那么好找柯南早就下岗了回复: 信息学奥赛试题里也有柯南
电脑侦探的诞生……汗一个……这个也可以编程,就没有什么不能的了~
回复: 信息学奥赛试题里也有柯南
晕到^我们刚刚在玩杀人游戏^
回复: 信息学奥赛试题里也有柯南
数组记录用字符串分析各人的话,然后逐一尝试
尝试的次数为:在M中取N的组合
对否?
回复: 信息学奥赛试题里也有柯南
………………--好高深啊 几乎就没看懂啥
回复: 信息学奥赛试题里也有柯南
这里也有http://www.vijos.cn/Problem2.asp?Series=柯南之Vijos被黑事件
回复: 信息学奥赛试题里也有柯南
数组记录用字符串分析各人的话,然后逐一尝试
尝试的次数为:在M中取N的组合
对否?
标程
program NOIP2003_2_Logic;
const
maxm=20;
dow:arrayof string=('Sunday.','Monday.','Tuesday.','Wednesday.',
'Thursday.','Friday.','Saturday.');
var
i,j,k,weekday,m,n,p,p1,p2,p3,index,resolution,total1,total2:byte;
name:arrayof string;
witness10,witness20:arrayof byte;
witness1,witness2:arrayof string;
name0,temp,temp0,temp1,temp2:string;
truth,truth0:arrayof byte;
f1,f2:text;fn1,fn2,fileNo:string;
flag:boolean;
begin
write('Input fileNo:');readln(fileNo);
fn1:='logic.in'+fileNo;fn2:='logic.ou'+fileNo;
assign(f1,fn1);reset(f1);assign(f2,fn2);rewrite(f2);
readln(f1,m,n,p);
for i:=1 to m do readln(f1,name);
total1:=0;total2:=0;
for i:=1 to p do begin
readln(f1,temp);
index:=pos(': ',temp);
temp1:=copy(temp,1,index-1);
temp2:=copy(temp,index+2,length(temp)-index-1);
if (temp2='I am guilty.') or (temp2='I am not guilty.') then
for j:=1 to m do
if name=temp1 then begin
inc(total1);
witness10:=j;
witness1:=temp2;
break;
end;
if (pos(' is guilty.',temp2)>0) or (pos(' is not guilty.',temp2)>0) then begin
temp0:=copy(temp2,1,pos(' is ',temp2)-1);
flag:=false;
for k:=1 to m do
if temp0=name then begin
flag:=true;
break;
end;
if flag then
for j:=1 to m do
if name=temp1 then begin
inc(total1);
witness10:=j;
witness1:=temp2;
break;
end;
end;
flag:=false;
for j:=1 to 7 do
if temp2='Today is '+ dow then begin
flag:=true;
break;
end;
if flag then
for j:=1 to m do
if name=temp1 then begin
inc(total2);
witness20:=j;
witness2:=temp2;
break;
end;
end;
close(f1);
resolution:=0;
for i:=1 to m do begin
if resolution>1 then break;
fillchar(truth,sizeof(truth),0);
for j:=1 to total1 do begin
if witness1='I am guilty.' then begin
if i=witness10 then
case truth of
0:truth:=1;
2:truth:=3;
end
else
case truth] of
0:truth]:=2;
1:truth]:=3;
end;
end;
if witness1='I am not guilty.' then begin
if i=witness10 then
case truth of
0:truth:=2;
1:truth:=3;
end
else
case truth] of
0:truth]:=1;
2:truth]:=3;
end;
end;
if (pos(' is guilty.',witness1)>0) then begin
temp:=copy(witness1,1,pos(' is guilty.',witness1)-1);
if name=temp then
case truth] of
0:truth]:=1;
2:truth]:=3;
end
else
case truth] of
0:truth]:=2;
1:truth]:=3;
end;
end;
if (pos(' is not guilty.',witness1)>0) then begin
temp:=copy(witness1,1,pos(' is not guilty.',witness1)-1);
if name=temp then
case truth] of
0:truth]:=2;
1:truth]:=3;
end
else
case truth] of
0:truth]:=1;
2:truth]:=3;
end;
end;
end;
if total2>0 then begin
for k:=1 to m do truth0:=truth;
for weekday:=1 to 7 do begin
for k:=1 to m do truth:=truth0;
for j:=1 to total2 do
if pos(dow,witness2)>0 then
case truth] of
0:truth]:=1;
2:truth]:=3;
end
else
case truth] of
0:truth]:=2;
1:truth]:=3;
end;
p1:=0;p2:=0;p3:=0;
for k:=1 to m do if truth=1 then inc(p1);
for k:=1 to m do if truth=2 then inc(p2);
for k:=1 to m do if truth=3 then inc(p3);
if (p1<=m-n) and (p2<=n) and (p3=0) then begin
name0:=name;
inc(resolution);
break;
end;
end;
end;
p1:=0;p2:=0;p3:=0;
for k:=1 to m do if truth=1 then inc(p1);
for k:=1 to m do if truth=2 then inc(p2);
for k:=1 to m do if truth=3 then inc(p3);
if (p1<=m-n) and (p2<=n) and (p3=0) and (name0<>name) then begin
name0:=name;
inc(resolution);
end;
end;
if resolution=1 then writeln(f2,name0);
if resolution=0 then writeln(f2,'Impossible');
if resolution>1 then writeln(f2,'Cannot Determine');
close(f2);
end.
回复: 信息学奥赛试题里也有柯南
:65: 彻底晕掉了。。。。。。。。回复: 信息学奥赛试题里也有柯南
9楼从哪找来的?回复: 信息学奥赛试题里也有柯南
9楼从哪找来的?复赛试题一般到处都有解答。。。。。。。。。这是NOIP2003第二题
回复: 信息学奥赛试题里也有柯南
这里也有http://www.vijos.cn/Problem2.asp?Series=柯南之Vijos被黑事件
都成一个系列了……作者真是强……
转一道题
CoVH之柯南购物
话说柯南开完锁后,本想继续往里走,但是却接到一个电话,原来小哀打电话叫柯南去买衣服(寒)
柯南来到步行街,发现衣服就如同它的价格一样漂亮(暴寒),柯南自然不想买这么贵的衣服,他想从买到的衣服总是比上一件便宜,但他又想小哀开心,于是他想尽量买到最多的衣服。你能帮帮他吗?
注:步行街从头到尾有n件商品,每件商品只有一件,柯南不能回头购买。
(又及:到后来,柯南进入OIBH总部后,才发现是12+5鼓动了小哀叫柯南买衣服,并且柯南看到12+5时12+5中的鱼牛正拿着个手机阴笑着,柯南一听,是小哀……于是,柯南侦察OIBH组织总部的计划完全失败,下一次又是什么呢?
输入格式 Input Format
输入第一行是n(1<=n<=2000),表示步行街上里有n件衣服
以下n行是步行街每件商品的价格,按顺序从头到尾。
输出格式 Output Format
输出第一行是柯南能购买的最多的商品数,接着是一个空格,再接着是柯南购买商品的方案数除以10000的余数。
回复: 信息学奥赛试题里也有柯南
感觉就像变装的编程嘛~~~~回复: 信息学奥赛试题里也有柯南
暴汗:029: !!!大老们放过我吧~~~~有没有简单点的,:65:回复: 信息学奥赛试题里也有柯南
楼主找到了一个让大家晕菜的理由,哈哈,大致能懂,我是学数学的,呵呵回复: 信息学奥赛试题里也有柯南
答案是用C语言编的吗?回复: 信息学奥赛试题里也有柯南
晕载,完全看不懂回复: 信息学奥赛试题里也有柯南
完全晕倒,看了6遍才大概看懂回复: 信息学奥赛试题里也有柯南
program 开头的肯定不是c语言嘛我们现在学的c语言都是#include<stdio.h>当函数头的
记得以前学的pascal(是这么拼吗)等等是这样的
是不是初中高中的信息学奥赛啊
强大的孩子们
不过这种让人晕菜的东西
我上大学以后居然是必修的
下周c语言程序设计考试
上帝保佑
页:
[1]
2