本地全过,洛谷30,拯救可怜的孩子吧
查看原帖
本地全过,洛谷30,拯救可怜的孩子吧
396994
Winston12321_楼主2022/7/20 08:42

注:我是把没有空格的名字补上空格了; 错误原因是输出“Cannot Determine”

#include <iostream>
#include <cstring>
#include <map>
using namespace std;
int m,n,p;
string st[5]= {""," I am guilty."," is guilty."," I am not guilty."," is not guilty."};
string dst=" Today is ";
string day[8]= {"","Monday.","Tuesday.","Wednesday.","Thursday.","Friday.","Saturday.","Sunday."};
string name[21];
string name_[21];
struct talk
{
	int kind;
	bool crime;
	string say;
	string ob;
} t[110];
string temp;
int lie,unk;
int pos,la;
bool flag;
map<string,int>lier;
int main()
{
	cin>>m>>n>>p;
	for(int i=1; i<=m; ++i)
	{
		cin>>name_[i];
		name[i]=' '+name_[i];
	}
	for(int i=1; i<=p; ++i)
	{
		cin>>temp;
		temp.pop_back();
		t[i].say=' '+temp;
		getline(cin,temp);
		if(temp==st[1])
		{
			t[i].ob=t[i].say;
			t[i].kind=1;
			t[i].crime=1;
			continue;
		}
		if(temp==st[3])
		{
			t[i].ob=t[i].say;
			t[i].kind=1;
			t[i].crime=0;
			continue;
		}
		for(int j=1; j<=m; ++j)
		{
			if(temp==name[j]+st[2])
			{
				t[i].ob=name[j];
				t[i].kind=1;
				t[i].crime=1;
				break;
			}
			if(temp==name[j]+st[4])
			{
				t[i].ob=name[j],t[i].kind=1,t[i].crime=0;
				break;
			}
		}
		if(t[i].kind) continue;
		for(int j=1; j<=7; ++j)
			if(temp==dst+day[j])
			{
				t[i].ob=day[j],t[i].kind=2;
				break;
			}
		if(t[i].kind) continue;
		t[i].kind=3;
	}
	for(int j=1; j<=7; ++j)
		for(int i=1; i<=m; ++i)
		{
			lie=0;
			unk=0;
			lier.clear();
			flag=1;
			for(int k=1; k<=p; ++k)
			{
				if(t[k].kind==3) continue;
				else if(t[k].kind==2)
				{
					if(t[k].ob==day[j])
					{
						if(lier[t[k].say]==0) lier[t[k].say]=2;
						else if(lier[t[k].say]==1)
						{
							flag=0;
							break;
						}
					}
					else
					{
						if(lier[t[k].say]==0) ++lie,lier[t[k].say]=1;
						else if(lier[t[k].say]==2)
						{
							flag=0;
							break;
						}
					}
				}
				else
				{
					if((t[k].ob==name[i] && t[k].crime==1) || (t[k].ob!=name[i] && t[k].crime==0))
					{
						if(lier[t[k].say]==0) lier[t[k].say]=2;
						else if(lier[t[k].say]==1)
						{
							flag=0;
							break;
						}
					}
					else
					{
						if(lier[t[k].say]==0) ++lie,lier[t[k].say]=1;
						else if(lier[t[k].say]==2)
						{
							flag=0;
							break;
						}
					}
				}
			}
			for(int i=1;i<=m;++i)
				if(lier[name[i]]==0)
					++unk;
			if(flag && lie<=n && lie+unk>=n)
			{
				if(la==0) ++pos,la=i;
				else if(la!=i)
				{
					cout<<"Cannot Determine";
					return 0;
				}
			}
		}
	if(pos==1) cout<<name_[la];
	else if(pos==0) cout<<"Impossible";
	return 0;
}
2022/7/20 08:42
加载中...