社区讨论

本地测能过,但交上去就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 条回复,欢迎继续交流。

正在加载回复...