双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意

注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N

(注意OJ上的数据存在问题:冒号后跟一个空格,CHARLES的话最后的句号‘.’应为半角,非全角)

可用样例输入:

MIKE
CHARLES
KATE
MIKE: I am guilty.
MIKE: Today is Sunday.
CHARLES: MIKE is guilty.
KATE: I am guilty.
KATE: How are you??
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> Par;
typedef pair<int,Par> Pr;
int M,N,P,ans,f[];
char s1[],s2[],s3[];
string dayStr[]={
"Monday"
,"Tuesday"
,"Wednesday"
,"Thursday"
,"Friday"
,"Saturday"
,"Sunday"
};
vector<string> name;
map<string,int> mp;
Pr prd[];
inline int readDigit(){
int x=;char c=getchar();
while(!isdigit(c))c=getchar();
for(;isdigit(c);c=getchar())x=x*+c-'';
return x;
}
inline void readName(){
char c;int i=;
while((c=getchar())!='\n')s1[i++]=c;
s1[i]='\0';
}
inline void readSubj(){
char c;int i=;
while((c=getchar())!=' ')s2[i++]=c;
s2[i-]='\0';
}
inline void readWords(){
char c;int i=;
while((c=getchar())!='\n')s3[i++]=c;
s3[i]='\0';
}
int main(){
int i,j,day,gty,fake,neutral,subid;
string sd;
bool jd,prim;
M=readDigit();
N=readDigit();
P=readDigit();
for(i=;i<M;i++){
readName();
name.push_back(s1);
mp[s1]=i;
}
for(i=;i<P;i++){
readSubj();
readWords();
sd=s3;
subid=mp[s2];
if(sd=="I am guilty.")
prd[i]=Pr(,Par(subid,subid));
else if(sd=="I am not guilty.")
prd[i]=Pr(,Par(subid,subid));
else{
jd=false;
for(j=;!jd&&j<;j++)
if(sd=="Today is "+dayStr[j]+"."){
prd[i]=Pr(,Par(subid,j));
jd=true;
break;
}
for(j=;!jd&&j<M;j++){
if(sd==name[j]+" is guilty."){
prd[i]=Pr(,Par(subid,j));
jd=true;
break;
}
else if(sd==name[j]+" is not guilty."){
prd[i]=Pr(,Par(subid,j));
jd=true;
break;
}
}
if(!jd)
prd[i]=Pr(,Par(,));
}
}
for(jd=false,day=;day<;day++){
for(gty=;gty<M;gty++){
memset(f,,sizeof f);
prim=true;
for(i=;i<P;i++){
if(prd[i].first==){
if(prd[i].second.second==gty){
if(!f[prd[i].second.first])
f[prd[i].second.first]=;
else if(f[prd[i].second.first]==){
prim=false;
break;
}
}
else{
if(!f[prd[i].second.first])
f[prd[i].second.first]=;
else if(f[prd[i].second.first]==){
prim=false;
break;
}
}
}
else if(prd[i].first==){
if(prd[i].second.second!=gty){
if(!f[prd[i].second.first])
f[prd[i].second.first]=;
else if(f[prd[i].second.first]==){
prim=false;
break;
}
}
else{
if(!f[prd[i].second.first])
f[prd[i].second.first]=;
else if(f[prd[i].second.first]==){
prim=false;
break;
}
}
}
else if(prd[i].first==){
if(prd[i].second.second==day){
if(!f[prd[i].second.first])
f[prd[i].second.first]=;
else if(f[prd[i].second.first]==){
prim=false;
break;
}
}
else{
if(!f[prd[i].second.first])
f[prd[i].second.first]=;
else if(f[prd[i].second.first]==){
prim=false;
break;
}
}
}
}
if(!prim)
continue;
neutral=fake=;
for(i=;i<M;i++)
if(f[i]==)
neutral++;
else if(f[i]==)
fake++;
if(fake<=N&&fake+neutral>=N){
if(!jd){
jd=true;
ans=gty;
}
else if(jd&&ans!=gty){
puts("Cannot Determine");
return ;
}
}
}
}
if(jd)
puts(name[ans].data());
else
puts("Impossible"); return ;
}

ZJNU 1205 - 侦探推理——高级的更多相关文章

  1. NOIP2003 侦探推理

    题二    侦探推理 [问题描述] 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯( ...

  2. 洛谷P1039 侦探推理(模拟)

    侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...

  3. 【洛谷P1039】侦探推理

    侦探推理 题目链接 这是一道恶心至极的模拟题 我们可以枚举罪犯是谁,今天是星期几,从而判断每个人说的话是真是假 若每个人说的话的真假一致,且说谎话的人数<=k且说真话的人数<=m-k,就是 ...

  4. Luogu P1039 侦探推理(模拟+枚举)

    P1039 侦探推理 题意 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯 ...

  5. P1039 侦探推理

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  6. [NOIP2003] 提高组 洛谷P1039 侦探推理

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  7. 【b302】侦探推理

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏 ...

  8. Luogu1039 侦探推理

    题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明 ...

  9. P1039 侦探推理(洛谷)

    昨天做了一个非常神奇的题,告诉我们做题之前一定要好好检测评测姬! 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先 ...

随机推荐

  1. 第十七篇 ORM跨表查询和分组查询---二次剖析

    ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...

  2. mysql 分组查询教程

    1.分组 分组就是将一个“数据集”划分成若干个“小区域”,然后针对若干个“小区域”进行数据处理. 2.分组的特点 1.)group by的含义:将查询结果按照1个或多个字段进行分组,字段值相同的为一组 ...

  3. UVA - 12627 Erratic Expansion(奇怪的气球膨胀)(递归)

    题意:问k小时后,第A~B行一共有多少个红气球. 分析:观察图可发现,k小时后,图中最下面cur行的红气球个数满足下式: (1)当cur <= POW[k - 1]时, dfs(k, cur) ...

  4. 使用node.js安装asar和反编译app.asar

    背景:app.asar文件是Electron加密打包时的中间产物,electron.exe调用resources文件夹下的app.asar从而实现不用解压缩而直接读取文件内容的高效. 一.需要先安装n ...

  5. jetty启动项目后js修改后无法保存

    在web.xml中加入如下配置即可: <servlet> <servlet-name>default</servlet-name> <servlet-clas ...

  6. bzoj 4236JOIOJI

    一开始忘掉特殊情况也是蛋疼2333(有一直到头的.mp[0][0]是要特判的) 做法也就是找mp[i][j]相同的东西.(貌似可以写成线性方程组(z=x+A,z=y+B)过这个的就是相等(可以先从2维 ...

  7. StringUtils.format用法

    String.format()字符串常规类型格式化的两种重载方式 format(String format, Object… args) 新字符串使用本地语言环境,制定字符串格式和参数生成格式化的新字 ...

  8. 18个python的高效编程技巧

    01 交换变量 >>>a=3 >>>b=6 这个情况如果要交换变量在c++中,肯定需要一个空变量.但是python不需要,只需一行,大家看清楚了 >>& ...

  9. PAT Advanced 1030 Travel Plan (30) [Dijkstra算法 + DFS,最短路径,边权]

    题目 A traveler's map gives the distances between cities along the highways, together with the cost of ...

  10. part12 非核心代码异步加载

    router文件中的 index component: ()=> import(‘path’) // 这样 访问一个页面 就只请求这个页面的js逻辑 //当app很小的的时候不需要做异步拆分 / ...