社区讨论
本地测能过,但交上去就WA了.
P1039[NOIP 2003 提高组] 侦探推理参与者 4已保存回复 8
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 8 条
- 当前快照
- 1 份
- 快照标识符
- @mhj3z80z
- 此快照首次捕获于
- 2025/11/03 20:20 4 个月前
- 此快照最后确认于
- 2025/11/03 20:20 4 个月前
rt
CPP#include<bits/stdc++.h>
using namespace std;
int m,n,p;
string name[30],s;
const string week[7]={"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
struct somebody
{
string name,say;
bool l;
}a[110];
bool check(string x)
{
if(x=="I am guilty."||x=="I am not guilty.") return true;
string checks="Today is ";
for(int i=0;i<7;i++)
{
checks+=week[i];
checks+=".";
if(x==checks) return true;
checks.erase(checks.size()-1-week[i].size(),week[i].size()+1);
}
for(int i=1;i<=m;i++)
{
checks=name[i]+" is guilty.";
if(x==checks) return true;
checks=name[i]+" is not guilty.";
if(x==checks) return true;
}
return false;
}
map<string,int>gu;
map<string,bool>lie,g;
bool wek[7];
string find()
{
for(int i=0;i<7;i++) wek[i]=0;
for(int i=1;i<=m;i++) gu[name[i]]=0;
for(int i=1;i<=p;i++)
{
if(!a[i].l) continue;
if(lie[a[i].name])
{
if(a[i].say=="I am not guilty.")
{
if(gu[a[i].name]==-1) return "NOT%";
gu[a[i].name]=1;
}
else if(a[i].say=="I am guilty.")
{
if(gu[a[i].name]==1) return "NOT%";
gu[a[i].name]=-1;
}
else if(a[i].say.find("is guilty.")!=-1)
{
string na="";
for(int j=0;s[j]!=' ';j++) na+=s[j];
if(gu[na]==1) return "NOT%";
gu[na]=-1;
}
else if(a[i].say.find("is not guilty.")!=-1)
{
string na="";
for(int j=0;s[j]!=' ';j++) na+=s[j];
if(gu[na]==-1) return "NOT%";
gu[na]=1;
}
else if(a[i].say.find("Today is")!=-1)
{
string d="";
for(int j=9;s[j]!='.';j++) d+=s[j];
for(int j=0;j<7;j++)
{
if(d==week[j])
{
if(wek[j]==1)
return "NOT%";
wek[j]=-1;
break;
}
}
}
}
else
{
if(a[i].say=="I am guilty.")
{
if(gu[a[i].name]==-1) return "NOT%";
gu[a[i].name]=1;
}
else if(a[i].say=="I am not guilty.")
{
if(gu[a[i].name]==1) return "NOT%";
cout<<a[i].name<<endl;
gu[a[i].name]=-1;
}
else if(a[i].say.find("is not guilty.")!=-1)
{
string na="";
for(int j=0;s[j]!=' ';j++) na+=s[j];
if(gu[na]==1) return "NOT%";
gu[na]=-1;
}
else if(a[i].say.find("is guilty.")!=-1)
{
string na="";
for(int j=0;s[j]!=' ';j++) na+=s[j];
if(gu[na]==-1) return "NOT%";
gu[na]=1;
}
else if(a[i].say.find("Today is")!=-1)
{
string d="";
for(int j=9;s[j]!='.';j++) d+=s[j];
for(int j=0;j<7;j++)
{
if(d==week[j])
{
if(wek[j]==-1)
return "NOT%";
for(int k=0;k<7;k++) wek[k]=-1;
wek[j]=1;
break;
}
}
}
}
}
int cnt=0;
for(int j=1;j<=m;j++) if(gu[name[j]]==1) cnt++;
if(cnt<=0) return "NOT%";
if(cnt>=2) return "MORE%";
for(int j=1;j<=m;j++) if(gu[name[j]]==1) return name[j];
}
void work(int k,int liec)
{
if(k>m)
{
if(liec==n) g[find()]++;
return;
}
lie[name[k]]=1;
work(k+1,liec+1);
lie[name[k]]=0;
work(k+1,liec);
}
int main()
{
cin>>m>>n>>p;
for(int i=1;i<=m;i++) cin>>name[i];
getline(cin,s);
for(int i=1;i<=p;i++)
{
getline(cin,s);
int po=0;
for(int j=0;s[j]!=':';j++,po++) a[i].name+=s[j];
po+=2;
for(;po<s.size();po++) a[i].say+=s[po];
if(check(a[i].say)) a[i].l=1;
}
work(1,0);
int cnt=0;
for(int i=1;i<=m;i++) if(g[name[i]]==1) cnt++;
if(cnt>2) cout<<"Cannot Determine";
else if(cnt==0) cout<<"Impossible";
else
{
for(int i=1;i<=m;i++)
{
if(gu[name[i]])
{
cout<<name[i];
break;
}
}
}
return 0;
}
回复
共 8 条回复,欢迎继续交流。
正在加载回复...