刚学 OI 1ms 求助,本地 AC 提交 WA 30pts

P1039 [NOIP2003 提高组] 侦探推理

```cpp //大模拟不写注释见祖宗 #include<bits/stdc++.h> using namespace std; const string p[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};//星期几 int n,m,t,ans,flg[25],chk[7],num[7],cnt[7]; string s[25],a[105],b[105]; inline bool check(int now){ memset(num,-1,sizeof(num)); memset(flg,-1,sizeof(flg)); memset(chk,-1,sizeof(chk)); memset(cnt,0,sizeof(cnt));//初始化 for(int i=1;i<=t;++i) for(int j=1;j<=n;++j) if(s[j]+':'==a[i]){//第 i 句式第 j 个人说的 if(b[i]=="I am guilty."){//我是罪犯 if(flg[j]==-1){ if(j==now) flg[j]=1; else flg[j]=0; } else{ if(flg[j]&&j!=now) return 0; if(!flg[j]&&j==now) return 0; } } else if(b[i]=="I am not guilty."){//我不是罪犯 if(flg[j]==-1){ if(j==now) flg[j]=0; else flg[j]=1; } else{ if(flg[j]&&j==now) return 0; if(!flg[j]&&j==now) return 0; } } else{ for(int k=1;k<=n;++k) if(s[k]+" is guilty."==b[i]){//XXX 是罪犯 if(flg[j]==-1){ if(k==now) flg[j]=1; else flg[j]=0; } else{ if(flg[j]&&k!=now) return 0; if(!flg[j]&&k==now) return 0; } break; } for(int k=1;k<=n;++k) if(s[k]+" is not guilty."==b[i]){//XXX 不是罪犯 if(flg[j]==-1){ if(k==now) flg[j]=0; else flg[j]=1; } else{ if(flg[j]&&k==now) return 0; if(!flg[j]&&k!=now) return 0; } break; } } break; } for(int i=1;i<=t;++i) for(int j=1;j<=n;++j) if(s[j]+':'==a[i]){//第 i 句式第 j 个人说的 for(int k=0;k<7;++k) if(b[i]=="Today is "+p[k]+'.'){ if(num[j]==-1) num[j]=k; else if(k!=num[j]) return 0; if(~flg[j]){ if(~chk[k]&&chk[k]!=flg[j]) return 0; chk[k]=flg[j]; } ++cnt[k]; } } int res=0; for(int i=0;i<7;++i) if(~chk[i]){ if(chk[i]){ if(res) return 0; res=i; } else{ for(int j=1;j<=n;++j) if(~num[j]&&num[j]==i) flg[j]=0; } } bool _=1; for(int i=0;i<7;++i) if(!cnt[i]||chk[i]){ _=0; break; } if(_) return 0; if(res){//确定了星期几 int tot1=0,tot2=0; for(int i=1;i<=n;++i) tot1+=(!flg[i]),tot2+=(flg[i]==-1||!flg[i]); if(tot2<m||tot1>m) return 0; } else{ int tot1=0,tot2=0,tot3=0,tot4=1e9,tot5=0; for(int i=1;i<=n;++i) tot1+=(flg[i]==1),tot2+=(flg[i]==1||flg[i]==-1); for(int i=0;i<7;++i) if(chk[i]==-1) tot5+=cnt[i],tot3=max(tot3,cnt[i]),tot4=min(tot4,cnt[i]); if(tot1+tot4>n-m||tot2-tot5+tot3<n-m) return 0; } return 1; } int main(){ // freopen("detective.in","r",stdin); // freopen("detective.out","w",stdout); cin>>n>>m>>t; for(int i=1;i<=n;++i) cin>>s[i]; for(int i=1;i<=t;++i){ cin>>a[i]; getchar(); getline(cin,b[i]); } for(int i=1;i<=n;++i){ if(check(i)){ if(ans){ puts("Cannot Determine"); return 0; } ans=i; } } if(ans) cout<<s[ans]<<endl; else puts("Impossible"); return 0; } ```
by qwq___qaq @ 2023-02-03 12:22:08


|