【NOIP2003】侦探原理 大模拟 附数据 附题解 附注意

题解:处理证词(我是处理得每个人指证谁,保谁,说今天周几),枚举检查(我是先外层枚举周几,然后枚举每个人说了什么检查)。

注意:

检查:

1.记录已确定说谎人数,不说谎人数。

2. 怎么方便怎么来,不要想着会超时。永远0ms!

3. 函数返回值的时机。

处理数据!!:

1. 全说谎,全不说谎

2. 名字叫“GUILTY”、“I”、星期几、特别长

3. 证词一旦不与表中相同,就作废!(正确的证词后面加一点点点废话,你懂的)

4. 测点怎么没有人叫TODAY?…………

5 .数据一定要读完。

其他:

什么输出时多一个少一个空格神马的一定要注意。

附代码,代码后面附NOIP数据,

#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 30
#define M 300
using namespace std;

char names[N][M];
char t[N][M];

int n,m,m2,p;
int hate[N][N],love[N][N],day[N][N];
int numa[N],numb[N],numc[N];

void deal()
{
	int i,j,k;
	int a,b;
	scanf("%d%d%d",&n,&m,&p);m2=n-m;
	for(i=1;i<=n;i++)scanf("%s",names[i]+1);
	for(i=1;i<=p;i++)
	{
		scanf("%s",t[1]+1);
		for(k=1;k<=n;k++)/*判断指证者(a)*/
		{
			for(j=1;t[1][j]!=':';j++)if(t[1][j]!=names[k][j])break;
			if(t[1][j]==':')
			{
				a=k;
				break;
			}
		}
		scanf("%s",t[2]+1);
		if(strcmp(t[2]+1,"Today")==0)/*证词说的是日期*/
		{
			scanf("%s",t[3]);
			scanf("%s",t[3]);
			if(strcmp(t[3],"Monday.")==0)day[a][++numc[a]]=1;
			if(strcmp(t[3],"Tuesday.")==0)day[a][++numc[a]]=2;
			if(strcmp(t[3],"Wednesday.")==0)day[a][++numc[a]]=3;
			if(strcmp(t[3],"Thursday.")==0)day[a][++numc[a]]=4;
			if(strcmp(t[3],"Friday.")==0)day[a][++numc[a]]=5;
			if(strcmp(t[3],"Saturday.")==0)day[a][++numc[a]]=6;
			if(strcmp(t[3],"Sunday.")==0)day[a][++numc[a]]=7;
		}
		else
		{
			if(strcmp(t[2]+1,"I")==0)b=a;
			else for(b=0,k=1;k<=n;k++)
			{
				for(j=1;t[2][j]!='\0';j++)if(t[2][j]!=names[k][j])break;
				if(t[2][j]=='\0')
				{
					b=k;
					break;
				}
			}
			if(!b)/*证词作废*/
			{
				gets(t[3]);
				continue;
			}
			else /*已经判断出被指证者*/
			{
				scanf("%s",t[3]);
				if(strcmp(t[3],"is")==0&&t[2][1]=='I')b=9;
				scanf("%s",t[3]);
				if(strcmp(t[3],"not")==0)
				{
					love[a][++numb[a]]=b;
					gets(t[4]);
					if(strcmp(t[4]+1,"guilty."))numb[a]--;
				}
				else
				{
			 		hate[a][++numa[a]]=b;
			 		if(strcmp(t[3],"guilty."))numa[a]--;
				}
			}
		}
	}
}
bool handle(int x)
{
	int A,B;/*已确定说真话假话的人数*/
	int i,j,dy,bel,brek;
	for(dy=1;dy<=7;dy++)
	{
		A=B=brek=0;
		for(i=1;i<=n;i++)
		{
			bel=0;
			for(j=1;j<=numc[i];j++)
			{
				if(day[i][j]==dy)
				{
					if(bel==-1)
					{
						brek=1;
						break;
					}
					bel=1;
				}
				else
				{
					if(bel==1)
					{
						brek=1;
						break;
					}
					bel=-1;
				}
			}

			if(brek)break;

			for(j=1;j<=numa[i];j++)
			{
				if(hate[i][j]==x)
				{
					if(bel==-1)
					{
						brek=1;
						break;
					}
					bel=1;
				}
				else
				{
					if(bel==1)
					{
						brek=1;
						break;
					}
					bel=-1;
				}
			}

			if(brek)break;

			for(j=1;j<=numb[i];j++)
			{
				if(love[i][j]==x)
				{
					if(bel==1)
					{
						brek=1;
						break;
					}
					bel=-1;
				}
				else
				{
					if(bel==-1)
					{
						brek=1;
						break;
					}
					bel=1;
				}
			}

			if(bel==1)A++;
			if(bel==-1)B++;
			if(B>m||A>m2)brek=1;
			if(brek)break;

		}
		if(!brek)return 1;
	}
	return 0;
}
int main()
{
//	freopen("logic.in","r",stdin);
//	freopen("logic.ou","w",stdout);
	int i,flag=0;
	deal();/*处理证词*/
	for(i=1;i<=n;i++)/*质疑罪犯*/
	{
		if(handle(i))
		{
			if(flag)
			{
				printf("Cannot Determine\n");
				return 0;
			}
			flag=i;
		}
	}
	if(!flag)
	{
		printf("Impossible\n");
		return 0;
	}
	else
	{
		printf("%s",names[flag]+1);
		return 0;
	}
	return 0;
}

数据零:

2 2 4

HELLO

GUILTY

HELLO: What is your name?

GUILTY: I am GUILTY.

GUILTY: Are you guilty?

HELLO: I am not guilty.

数据一:

1 0 2

A

A: I am guilty.

A: 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.

数据三:

7 3 10

MONDAY

TUESDAY

WEDNESDAY

THURSDAY

FRIDAY

SATURDAY

SUNDAY

MONDAY: Today is Monday.

TUESDAY: Today is Tuesday.

WEDNESDAY: Today is Wednesday.

THURSDAY: Today is Thursday.

FRIDAY: MONDAY is not guilty.

FRIDAY: TUESDAY is not guilty.

FRIDAY: WEDNESDAY is not guilty.

FRIDAY: THURSDAY is not guilty.

SATURDAY: SUNDAY is not guilty.

SUNDAY: SATURDAY is not guilty.

数据四:

4 1 5

KYO

IORI

CHIZURU

OROCHI

KYO: I am guilty.

IORI: I am not guilty.

CHIZURU: OROCHI is guilty.

OROCHI: Today is Monday.

OROCHI: I am guilty.

数据五:

10 7 20

A

AA

AAA

AAAA

AAAAA

AAAAAA

AAAAAAA

AAAAAAAA

AAAAAAAAA

AAAAAAAAAA

A: Today is Monday.

AA: Today is Monday.

AAA: Today is Monday.

AAAA: Today is Monday.

AAAAA: Today is Monday.

AAAAAA: Today is Monday.

AAAAAAA: Today is Monday.

AAAAAAAA: Today is Sunday.

AAAAAAAAA: Today is Sunday.

AAAAAAAAAA: Today is Sunday.

AAAAAAAAAA: AAA is not guilty.

AAAAAAAAA: A is not guilty.

AAAAAAAA: AAAAA is not guilty.

AAAAAAA: AAAAAA is guilty.

AAAAAA: AAAAAAAAAA is guilty.

AAAAA: AAAAAAAA is guilty.

AAAA: AAAAAAA is guilty.

AAA: AA is guilty.

AA: AAAAAAAAA is guilty.

A: AAAAA is guilty.

数据六:

1 1 2

ALAN

ALAN: I am not guity.

ALAN: I am not not guity.

数据七:

3 3 3

SAM

SANDY

SUE

SAM: I am not guity. Am I???

SUE: SANDY is guity.

SANDY: SUE is guity.

数据八:

10 10 10

A

B

C

D

E

F

G

H

I

J

A: B is guilty.

B: C is guilty.

C: D is guilty.

D: E is guilty.

E: F is guilty.

F: G is guilty.

G: H is guilty.

H: I love you!

I: I am not guilty.

J: I is not guilty.

数据九:

1 0 3

CENGJINGYOUYIDUANZHENZHIDEGANQINGFANGZAIWOMIANQIANWOMEIYOUZHENXIDENGDAOSHIQULEYIHOUCAIZHUIHUIMOJIRENSHIJIANZUITONGKUDESHIMOGUOYUCIRUGUOSHANGTIANNENGGEIWOYIGEZAILAIYICIDEJIHUIWOHUIDUINAGENVHAIZISHUOSANGEZI

CENGJINGYOUYIDUANZHENZHIDEGANQINGFANGZAIWOMIANQIANWOMEIYOUZHENXIDENGDAOSHIQULEYIHOUCAIZHUIHUIMOJIRENSHIJIANZUITONGKUDESHIMOGUOYUCIRUGUOSHANGTIANNENGGEIWOYIGEZAILAIYICIDEJIHUIWOHUIDUINAGENVHAIZISHUOSANGEZI: I love you!

CENGJINGYOUYIDUANZHENZHIDEGANQINGFANGZAIWOMIANQIANWOMEIYOUZHENXIDENGDAOSHIQULEYIHOUCAIZHUIHUIMOJIRENSHIJIANZUITONGKUDESHIMOGUOYUCIRUGUOSHANGTIANNENGGEIWOYIGEZAILAIYICIDEJIHUIWOHUIDUINAGENVHAIZISHUOSANGEZI: If there must be a deadline,

CENGJINGYOUYIDUANZHENZHIDEGANQINGFANGZAIWOMIANQIANWOMEIYOUZHENXIDENGDAOSHIQULEYIHOUCAIZHUIHUIMOJIRENSHIJIANZUITONGKUDESHIMOGUOYUCIRUGUOSHANGTIANNENGGEIWOYIGEZAILAIYICIDEJIHUIWOHUIDUINAGENVHAIZISHUOSANGEZI: I hope it is 10000 years!!!

时间: 2024-10-29 10:46:37

【NOIP2003】侦探原理 大模拟 附数据 附题解 附注意的相关文章

AC日记——神奇的幻方 洛谷 P2615(大模拟)

题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. 之后,按如下方式从小到大依次填写每个数K(K=2,3,…,N*N): 1.若(K−1)在第一行但不在最后一列,则将K填在最后一行,(K−1)所在列的右一列: 2.若(K−1)在最后一列但不在第一行,则将K填在第一列,(K−1)所在行的上一行: 3.若(K−1)在第一行最后一列,则将K填在(K−1)

Atitit.javascript 实现类的方式原理大总结

Atitit.javascript 实现类的方式原理大总结 1. 实现类的式::构造方法方式:原型方式:构造方法+原型的混合方式 1 2. 原型方式(function mode)经典式..实现属性推荐 1 3. this的注意事项 2 4. 原型方式 prototype,实现方法推荐 3 5. 混合方式(属性classic mode,方法propoty式),推荐 3 6. 私有方法 4 7. 静态的属性and方法... 5 8. 闭包式 5 9. mootools框架,感觉很不错,它对Javas

App开发:模拟服务器数据接口 - MockApi

App开发:模拟服务器数据接口 - MockApi 为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现MockApi. 需求概述 在app开发过程中,在和服务器人员协作时,一般会第一时间确定数据接口的请求参数和返回数据格式,然后服务器人员会尽快提供给客户端可调试的假数据接口.不过有时候就算是假数据接口也来不及提供,或者是接口数据格式来回变动--很可能是客

Java虚拟机 - 结构原理与运行时数据区域

http://liuwangshu.cn/java/jvm/1-runtime-data-area.html 前言 本来计划要写Android内存优化的,觉得有必要在此之前介绍一下Java虚拟机的相关知识,Java虚拟机也并不是三言两语能够介绍完的,因此开了Java虚拟机系列,这一篇文章我们来学习Java虚拟机的结构原理与运行时数据区域. 1.Java虚拟机概述 Oracle官方定义的Java技术体系主要包括以下几个部分: Java程序设计语言 各种平台的Java虚拟机 Class文件格式 Ja

ANDROID内存优化以及原理(大汇总——上)

写在最前: 本文的思路主要借鉴了2014年AnDevCon开发者大会的一个演讲PPT,加上把网上搜集的各种内存零散知识点进行汇总.挑选.简化后整理而成. 所以我将本文定义为一个工具类的文章,如果你在ANDROID开发中遇到关于内存问题,或者马上要参加面试,或者就是单纯的学习或复习一下内存相关知识,都欢迎阅读.(本文最后我会尽量列出所参考的文章). 内存简介: RAM(random access memory)随机存取存储器.说白了就是内存. 一般Java在内存分配时会涉及到以下区域: 寄存器(R

一次SQL查询优化原理分析(900W+数据,从17s到300ms)

一次SQL查询优化原理分析(900W+数据,从17s到300ms) Muscleape关注 132019.12.09 00:48:52字数 1,163阅读 2,730 有一张财务流水表,未分库分表,目前的数据量为9555695,分页查询使用到了limit,优化之前的查询耗时16 s 938 ms (execution: 16 s 831 ms, fetching: 107 ms),按照下文的方式调整SQL后,耗时347 ms (execution: 163 ms, fetching: 184 m

大v用户数据统计分析

1,统计数据的基本情况,包括微博总数,用户总数,最活跃和最不活跃的用户id #!/bin/sh source_dir=/home/minelab/data/DATA source_file_name=userinfo_00_au_1_out source_file=$source_dir/$source_file_name #source_file=test.src out_dir=/home/minelab/liweibo/daV out_file_name=basic_satic.txt o

JDBC:数据库操作:处理大对象CLOB数据

目标: 了解大对象处理基本原理, 掌握CLOB数据的读,写操作. 可以使用CLOB类处理大文本数据. 大对象处理主要指CLOB和BLOB两种类型字段.可以大量存储文字. 要想在程序中处理这样的大数据操作,则必须使用preparedStatement完成.所有文件内容通过IO流方式从大文本字段中保存和读取. 写入大数据对象: 使用PreparedStatement接口中的方法. void setAsciiStream(int parameterIndex, InputStream x, int l

使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置)

原文:使用Socket通信实现Silverlight客户端实时数据的获取(模拟GPS数据,地图实时位置) 在上一篇中说到了Silverlight下的Socket通信,在最后的时候说到本篇将会结合地图.下面就来看看本文实现的功能: Silverlight 与服务器利用Socket通讯,实时从服务器获取数据(本文中的数据是地理坐标),由于没有GPS,所以本文在服务器写了一个构造新坐标的函数(本文是一个三角函数),然后利用Timer组件,实时调用,得到新的坐标,并将新的坐标发送给客户端,客户端接收到发