[NOIP2003] 提高组 洛谷P1039 侦探推理
题目描述
明明同学最近迷上了侦探漫画《柯南》并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏。游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯。接着,明明逐个询问每一个同学,被询问者可能会说:

证词中出现的其他话,都不列入逻辑推理的内容。
明明所知道的是,他的同学中有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
惊天大模拟
惊天码农题
首先需要花式截取出每个人的信息,然后需要记录以下信息:
每个人说的日期
每个人说自己是不是罪犯
每个人说谁是罪犯
每个人说谁不是罪犯
枚举日期和嫌疑犯,进行判断:
记说谎人数为tmp,可疑人数为cnt(可疑人数指没有说过真话,也没有说过假话的人数),题目限制说谎人数为m
若tmp>m,说明当前枚举的情况不成立。
若tmp+cnt<m,说明已知说谎的人和可能说谎的人加起来都不够目标值,不成立。
除此之外的情况下,当前枚举到的嫌疑犯可能是罪犯。
若可能是罪犯的人数大于1人,cannot determine
/*By SilverN*/
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<vector>
#include<map>
using namespace std;
string pp[]={"am guilty","am not guilty","is guilty.","is not guilty."};
string week[]={" ","is Monday","is Tuesday","is Wednesday","is Thursday","is Friday","is Saturday","is Sunday"};
//
int n,m,p;
//
string name[];
map<string,int>mp;
//人名
string s[];
struct person{
bool is;//是否确定是罪犯
int wk;//每个人对天气的判断
int guil[];//每个人对其他人身份的判断
vector<int>g_list,nog_list;//每个人指认的罪犯
}a[];
//身份信息
bool posi[];
int work(int day,int uso){
int cnt=,tmp=;//不确定的人,确定的凶手 for(int i=;i<=n;i++){
bool f_true=,f_false=;
if(a[i].is || (a[i].wk && a[i].wk!=day)){//天气说错
f_false=;
}
if(a[i].guil[uso]==-){//说罪犯不是罪犯
f_false=;
}
if(a[i].guil[uso]==)f_true=;//说罪犯是罪犯
if(i!=uso && a[i].guil[i]==){//不是罪犯说自己是罪犯
f_false=;
}
for(int j=;j<a[i].g_list.size();j++)if(a[i].g_list[j]!=uso){//说不是罪犯的人是罪犯
f_false=;
}
for(int j=;j<a[i].nog_list.size();j++)if(a[i].nog_list[j]!=uso){//说不是罪犯的人不是罪犯
f_true=;
}
if(a[i].wk==day)f_true=;
if(i==uso && a[i].guil[uso]==) f_true=;//凶手说自己是凶手
if(i!=uso && a[i].guil[i]==-) f_true=;//不是凶手说自己不是凶手
if(f_true && f_false)return ;//不合法
if(f_false)tmp++;
if(!f_true && !f_false)cnt++;//不确定的人
}
// printf("day:%d uso:%d cnt:%d tmp:%d\n",day,uso,cnt,tmp); if(tmp>m)return ;
if(tmp+cnt<m)return ;
return ;
}
int target=;
void solve(){
int tmp=;
int i,j;
for(i=;i<=;i++)//枚举日期
for(j=;j<=n;j++)//枚举凶手
{
if(posi[j])continue;
if(work(i,j)){
++tmp;
posi[j]=;
if(tmp>=){
printf("Cannot Determine\n");
return;
}
target=j;
}
}
if(!target)printf("Impossible\n");
cout<<name[target]<<endl;
return;
}
//
int main(){
scanf("%d%d%d",&n,&m,&p);//总人数 说谎人数 证言数
int i,j;
for(i=;i<=n;i++){
cin>>name[i];
mp[name[i]]=i;
}
for(i=;i<=p;++i){
cin>>s[i];
// cout<<"test"<<s[i]<<endl;
s[i]=s[i].substr(,s[i].find(':'));
// cout<<"finn"<<endl;
int id=mp[s[i]];
getchar();
getline(cin,s[i]);
// cout<<"now-"<<s[i]<<endl;
//判断
if(s[i][]=='I'){
if(s[i].find(pp[])!=-){//I am guilty
a[id].guil[id]=; continue;
}
else if(s[i].find(pp[])!=-){//I am not guilty
a[id].guil[id]=-; continue;
}
}
else{
int tmp=;
tmp=s[i].find(pp[]);
if(tmp!=-){//is guilty
// printf("is guilty: %d\n",tmp);
s[i]=s[i].substr(,tmp-);
// printf("mp:%d\n",mp[s[i]]);
// cout<<"test: "<<s[i]<<"eld"<<endl;
a[id].guil[mp[s[i]]]=;
a[id].g_list.push_back(mp[s[i]]);
continue;
}
tmp=s[i].find(pp[]);
if(tmp!=-){//is not guilty
s[i]=s[i].substr(,tmp-);
// printf("mp:%d\n",mp[s[i]]);
// cout<<"test: "<<s[i]<<"eld"<<endl;
a[id].guil[mp[s[i]]]=-;
a[id].nog_list.push_back(mp[s[i]]);
continue;
}
for(j=;j<=;j++)//天气判定
{
tmp=s[i].find(week[j]);
if(tmp!=-){
if(!a[id].wk)
a[id].wk=j;
else a[id].is=;//天气前后矛盾,肯定是骗子
break;
}
}
}
//
}
//结束读入
/*
for(i=1;i<=n;i++){
printf("info of %d:\n",i);
cout<<name[i]<<endl; printf("wk: %d\n",a[i].wk);
printf("self: %d\n",a[i].guil[i]);
for(j=0;j<a[i].g_list.size();j++)printf("%d ",a[i].g_list[j]);
printf("\n");
for(j=0;j<a[i].nog_list.size();j++)printf("%d ",a[i].nog_list[j]);
printf("\n");
}*/
//
solve(); return ;
}
[NOIP2003] 提高组 洛谷P1039 侦探推理的更多相关文章
- 洛谷P1039 侦探推理(模拟)
侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...
- 洛谷 P1039侦探推理
/* 枚举罪犯和星期几,那么所有人说的话是真是假一目了然. 首先一个人不能既说真话又说假话. 即: I am guilty. I am not guilty. 因为非真即假,所以直接判断impossi ...
- 洛谷 P1039 侦探推理
题目:https://www.luogu.org/problemnew/show/P1039 分析: 这道题是一道有技术含量的模拟,我们主要是不要让计算机向人一样思考,只需要让他穷举变化的星期几和当罪 ...
- [NOIP2003] 提高组 洛谷P1041 传染病控制
题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...
- [NOIP2003] 提高组 洛谷P1040 加分二叉树
题目描述 设一个n个节点的二叉树tree的中序遍历为(1,2,3,…,n),其中数字1,2,3,…,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都 ...
- [NOIP2003] 提高组 洛谷P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- 洛谷P1039侦探推理题解
#include<cstdio> #include<cstring> #include<string> #include<iostream> using ...
- [NOIP2015] 提高组 洛谷P2615 神奇的幻方
题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...
- [NOIP2014] 提高组 洛谷P2038 无线网络发射器选址
题目描述 随着智能手机的日益普及,人们对无线网的需求日益增大.某城市决定对城市内的公共场所覆盖无线网. 假设该城市的布局为由严格平行的129 条东西向街道和129 条南北向街道所形成的网格状,并且相邻 ...
随机推荐
- AndroidStudio中使用SVN
AndroidStudio中使用SVN提交项目 1.安装SVN,我选择使用TortoiseSVN-1.8.7.25475-x64-svn-1.8.9.msi(安装文件地址如下:http://downl ...
- Excuse me?这个前端面试在搞事!
金三银四搞事季,前端这个近年的热门领域,搞事气氛特别强烈,我朋友小伟最近就在疯狂面试,遇到了许多有趣的面试官,有趣的面试题,我来帮这个搞事 boy 转述一下. 以下是我一个朋友的故事,真的不是我. f ...
- cordova安装方法
安装cordova之前需要先安装node.js和npm 然后在命令行运行:npm install -g cordova即可安装到最新版本的cordova 如果要安装指定版本,命令为:npm insta ...
- SQL Server 查询锁表和接锁表
SQL Server 查询锁表 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) as tableNa ...
- 算法之A星算法(寻路)
1.启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省略大量无谓的搜索路径,提高了效率.在启发式搜索中,对位置的估价是十分 ...
- 再遇BGP
第一次遇到BGP,是在大学的课堂上,现在再次看到它,有种深深的无奈,我只记得它的名字,忘记了它的样子. 那么什么是BGP呢? 翻译过来就是边界网关协议,一个用来网络数据进行选路的路由协议,使用TCP协 ...
- Java三大特性之封装
.封装 1.概念:把对象的内部细节封闭起来,只提供操作对象属性的公共方法. 封装是面向对象编程语言对客观世界的模拟:如:电视机,她的内部元件就被封闭起来了,仅仅暴露电视机按钮来供人使用,这样就没有人能 ...
- Smart Contracts
A smart contract is a computer code running on top of a blockchain containing a set of rules under w ...
- linux下C的建立、编译和运行 gcc (附上Windows下visual c++的用法)
2019/6/24 1. 环境:window10下安装了MobaXterm,这里申请了阿里云的服务账号,可以直接使用linux系统,避免安装虚拟机等. 2. 判断linux下是否有GCC编译工具(我们 ...
- Android项目源码分享
http://blog.csdn.net/gao_chun/article/details/47263063 Android项目源码分享 给大家分享几个Android开发项目源码,大部分功能相信可以在 ...