布诗,这题能做?
原题链接:86.侦探推理2025-06-28 20:09:12
发布于:重庆
这么难居然不是黑题
全部评论 3
#include<bits/stdc++.h> using namespace std; const string days[]={ "Today is Monday.", "Today is Tuesday.", "Today is Wednesday.", "Today is Thursday.", "Today is Friday.", "Today is Saturday.", "Today is Sunday." }; map<string,int>num; string name[22]; int n,m,p,cnt,ans,TF[102],T,F; struct word{ int id; string st; }f[102]; string s; bool pdTF(int id,bool b){ if(TF[id]==-1){ TF[id]=b; if(b)++T;else ++F; }else{ if(TF[id]==b)return 0;else return 1; } if(F>m||T>n-m)return 1; return 0; } void Judge(int Xs,string day){ memset(TF,-1,sizeof(TF)); T=F=0; for(int i=1;i<=p;++i){ int pos; pos=f[i].st.find("I am guilty."); if(~pos){ if(pdTF(f[i].id,f[i].id==Xs))return; } pos=f[i].st.find("I am not guilty."); if(~pos){ if(pdTF(f[i].id,f[i].id!=Xs))return; } pos=f[i].st.find(" is guilty."); if(~pos){ string now=f[i].st; now.erase(pos,11); int id=num[now]; if(pdTF(f[i].id,id==Xs))return; } pos=f[i].st.find(" is not guilty."); if(~pos){ string now=f[i].st; now.erase(pos,15); int id=num[now]; if(pdTF(f[i].id,id!=Xs))return; } pos=f[i].st.find("Today is "); if(~pos){ if(pdTF(f[i].id,f[i].st==day))return; } } if(ans&&ans!=Xs){ cout<<"Cannot Determine"<<endl; exit(0); } ans=Xs; } int main(){ cin>>n>>m>>p; for(int i=1;i<=n;++i){ cin>>name[i]; num[name[i]]=i; } for(int i=1;i<=p;++i){ cin>>s; s.erase(s.length()-1,1); f[i].id=num[s]; getline(cin,f[i].st); f[i].st.erase(0,1); char ch=f[i].st[f[i].st.length()-1]; if(ch=='\n'||ch=='\r'||ch==' ') f[i].st.erase(f[i].st.length()-1,1); } ans=0; for(int i=1;i<=n;++i) for(int j=0;j<7;++j) Judge(i,days[j]); if(!ans) cout<<"Impossible"<<endl;else cout<<name[ans]<<endl; return 0; }
2025-07-03 来自 福建
0其实也就是模拟而已,没有这么复杂
2025-06-28 来自 广东
0《没有这么复杂》
2025-06-28 来自 重庆
0
e
2025-06-28 来自 重庆
0
有帮助,赞一个