ZJNU 1205 - 侦探推理——高级

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

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

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

  1 /*
  2 Written By StelaYuri
  3 */
  4 #include<bits/stdc++.h>
  5 using namespace std;
  6 typedef pair<int,int> Par;
  7 typedef pair<int,Par> Pr;
  8 int M,N,P,ans,f[25];
  9 char s1[300],s2[300],s3[300];
 10 string dayStr[7]={
 11     "Monday"
 12     ,"Tuesday"
 13     ,"Wednesday"
 14     ,"Thursday"
 15     ,"Friday"
 16     ,"Saturday"
 17     ,"Sunday"
 18 };
 19 vector<string> name;
 20 map<string,int> mp;
 21 Pr prd[105];
 22 inline int readDigit(){
 23     int x=0;char c=getchar();
 24     while(!isdigit(c))c=getchar();
 25     for(;isdigit(c);c=getchar())x=x*10+c-‘0‘;
 26     return x;
 27 }
 28 inline void readName(){
 29     char c;int i=0;
 30     while((c=getchar())!=‘\n‘)s1[i++]=c;
 31     s1[i]=‘\0‘;
 32 }
 33 inline void readSubj(){
 34     char c;int i=0;
 35     while((c=getchar())!=‘ ‘)s2[i++]=c;
 36     s2[i-1]=‘\0‘;
 37 }
 38 inline void readWords(){
 39     char c;int i=0;
 40     while((c=getchar())!=‘\n‘)s3[i++]=c;
 41     s3[i]=‘\0‘;
 42 }
 43 int main(){
 44     int i,j,day,gty,fake,neutral,subid;
 45     string sd;
 46     bool jd,prim;
 47     M=readDigit();
 48     N=readDigit();
 49     P=readDigit();
 50     for(i=0;i<M;i++){
 51         readName();
 52         name.push_back(s1);
 53         mp[s1]=i;
 54     }
 55     for(i=0;i<P;i++){
 56         readSubj();
 57         readWords();
 58         sd=s3;
 59         subid=mp[s2];
 60         if(sd=="I am guilty.")
 61             prd[i]=Pr(1,Par(subid,subid));
 62         else if(sd=="I am not guilty.")
 63             prd[i]=Pr(2,Par(subid,subid));
 64         else{
 65             jd=false;
 66             for(j=0;!jd&&j<7;j++)
 67                 if(sd=="Today is "+dayStr[j]+"."){
 68                     prd[i]=Pr(3,Par(subid,j));
 69                     jd=true;
 70                     break;
 71                 }
 72             for(j=0;!jd&&j<M;j++){
 73                 if(sd==name[j]+" is guilty."){
 74                     prd[i]=Pr(1,Par(subid,j));
 75                     jd=true;
 76                     break;
 77                 }
 78                 else if(sd==name[j]+" is not guilty."){
 79                     prd[i]=Pr(2,Par(subid,j));
 80                     jd=true;
 81                     break;
 82                 }
 83             }
 84             if(!jd)
 85                 prd[i]=Pr(4,Par(0,0));
 86         }
 87     }
 88     for(jd=false,day=0;day<7;day++){
 89         for(gty=0;gty<M;gty++){
 90             memset(f,0,sizeof f);
 91             prim=true;
 92             for(i=0;i<P;i++){
 93                 if(prd[i].first==1){
 94                     if(prd[i].second.second==gty){
 95                         if(!f[prd[i].second.first])
 96                             f[prd[i].second.first]=1;
 97                         else if(f[prd[i].second.first]==2){
 98                             prim=false;
 99                             break;
100                         }
101                     }
102                     else{
103                         if(!f[prd[i].second.first])
104                             f[prd[i].second.first]=2;
105                         else if(f[prd[i].second.first]==1){
106                             prim=false;
107                             break;
108                         }
109                     }
110                 }
111                 else if(prd[i].first==2){
112                     if(prd[i].second.second!=gty){
113                         if(!f[prd[i].second.first])
114                             f[prd[i].second.first]=1;
115                         else if(f[prd[i].second.first]==2){
116                             prim=false;
117                             break;
118                         }
119                     }
120                     else{
121                         if(!f[prd[i].second.first])
122                             f[prd[i].second.first]=2;
123                         else if(f[prd[i].second.first]==1){
124                             prim=false;
125                             break;
126                         }
127                     }
128                 }
129                 else if(prd[i].first==3){
130                     if(prd[i].second.second==day){
131                         if(!f[prd[i].second.first])
132                             f[prd[i].second.first]=1;
133                         else if(f[prd[i].second.first]==2){
134                             prim=false;
135                             break;
136                         }
137                     }
138                     else{
139                         if(!f[prd[i].second.first])
140                             f[prd[i].second.first]=2;
141                         else if(f[prd[i].second.first]==1){
142                             prim=false;
143                             break;
144                         }
145                     }
146                 }
147             }
148             if(!prim)
149                 continue;
150             neutral=fake=0;
151             for(i=0;i<M;i++)
152                 if(f[i]==0)
153                     neutral++;
154                 else if(f[i]==2)
155                     fake++;
156             if(fake<=N&&fake+neutral>=N){
157                 if(!jd){
158                     jd=true;
159                     ans=gty;
160                 }
161                 else if(jd&&ans!=gty){
162                     puts("Cannot Determine");
163                     return 0;
164                 }
165             }
166         }
167     }
168     if(jd)
169         puts(name[ans].data());
170     else
171         puts("Impossible");
172
173     return 0;
174 }

原文地址:https://www.cnblogs.com/stelayuri/p/12233440.html

时间: 2024-11-09 03:12:33

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

NOIP2003 侦探推理

题二    侦探推理 [问题描述] 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯.接着,明明逐个询问每一个同学,被询问者可能会说:       证词中出现的其他话,都不列入逻辑推理的内容. 明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真. 现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个! [

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

[原题] P1106侦探推理 Accepted 标签:[显示标签] 描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯.接着,明明逐个询问每一个同学,被询问者可能会说: 证词中出现的其他话,都不列入逻辑推理的内容. 明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真. 现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,

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

题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯.接着,明明逐个询问每一个同学,被询问者可能会说: 证词中出现的其他话,都不列入逻辑推理的内容. 明明所知道的是,他的同学中有N个人始终说假话,其余的人始终说真. 现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个! 输入输出格式 输入格式: 输入由若干行组

P1039 侦探推理

题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情况下),明明的任务就是找出这个罪犯.接着,明明逐个询问每一个同学,被询问者可能会说: 证词中出现的其他话,都不列入逻辑推理的内容. 明明所知道的是,他的同学中有NNN个人始终说假话,其余的人始终说真. 现在,明明需要你帮助他从他同学的话中推断出谁是真正的凶手,请记住,凶手只有一个! 输入输出格式 输入格式: 输入由若干

ZJNU 1217 - 航线问题——高级

将所有航线的其中一边排序后,另一边进行类dp 定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值 比如下面一个样例 1 3 2 4 3 1 4 2 此时对于航线左边的位置序号已经是排好序的了 那么只需要考虑右边的情况 在所有只开通1条航道的组合中 右侧出现的结果可能是{1},{2},{3},{4} 所以c[1]=1 在所有只开通2条航道的组合中 右侧出现的结果可能是{3,4},{1,2} 这里有两个组合,每个组合位置序号最大的元素分别是4和2,取小

ZJNU 1223 - 素数距离——高级

因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≍46350之内的所有素数,以其作为因子再将题目给定区间内的所有不是素数的数标记排除 然后将素数存放在prnum这个vector集合中便于调用 在排除阶段,可以用 l=((L+prnum[i]-1)/prnum[i])*prnum[i] 计算出区间内的第一个是prnum[i]的倍数的数 注意,如果计算出来的使其本身,取倍数 再用 r=R/prnum

侦探游戏:不服来战

如果将人类的全部能力比喻成一座冰山的话,我们已经挖掘的,仅仅是冰山一角.假如能够探测到水下的冰山,那么无疑会使我们得到全面的提升.当今时代,竞争加剧,生活节奏不断加快,在这样的环境中,无论是渴望成为社会经营的莘莘学子,还是渴望在工作中寻求突破的上班族,具有一套完成的思维体系都至关重要.探究思维大厦,了解其中的构造并且有目的,有计划的游走期间十分的必要.只有全身心的投入到观察与思考中,你就可以发现它面纱下的真面目,这种探究的过程就是你收益的过程,破茧成蝶的过程. 在启发思维的过程中,侦探推理举足轻

【NOIP2003】提高组

T1神经网络 题目链接 这道题是第一题,把它放在签到题的位置就不用想太多.听说可以用拓扑排序,但是实际上由于数据比较水,裸的bfs即可AC. 注意几点:输入层的ci[i]不需要减去ui[i]:只有当ci[i]>0时才能传递给下一层:只需要输出ci[i]>0的输出层. 剩下的细节实现看代码: #include<cstdio> #include<cstring> const int maxn=205; using namespace std; int ci[maxn],ui

需求管理之可行性分析和需求分析

可行性分析是要决定"做还是不做". 需求分析是要决定"做什么,不做什么".      即使可行性分析是客观的.科学的.但决策仍有可能是错误的. 因为决策者是人,人会冲动,有赌博心态.假设可行性分析表明做某件事的成功率是10%,失败率是90%.倘若该事情的意义非常大.决策者或许会一拍脑袋:"豁出去,干!"于是这世界就多了一份极喜与极悲. 4.1节讲述可行性分析的四大要素:经济.技术.社会环境和人.     眼下国内非常多软件公司做系统集成项目,假设