70 pts 代码求条教
查看原帖
70 pts 代码求条教
504093
dyc2022楼主2023/10/13 18:16

思路:枚举罪犯是哪一个人,再枚举今天是星期几。用数组 fi,jf_{i,j} 表示第 ii 个人说第 jj 个人是不是罪犯。11 表示是,−1-1 表示不是,00 表示未知。然后再存下来每个人说今天是星期几。结果 70pts。

到底是为什么?

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,p,cnt;
map<string,int> nam;
string nam2[33];
string word[550][550];
int change(string w)
{
	if(w=="MONDAY.")return 1;
	if(w=="TUESDAY.")return 2;
	if(w=="WEDNESDAY.")return 3;
	if(w=="THURSDAY.")return 4;
	if(w=="FRIDAY.")return 5;
	if(w=="SATURDAY.")return 6;
	if(w=="SUNDAY.")return 7;
}
vector<int> f[22][22];
vector<int> we[22];
string ans;
int ccnt=0;
main()
{
	cin>>n>>m>>p;
	for(int i=1;i<=n;i++)
	{
		string tt;
		cin>>tt;
		nam[tt+":"]=i;
		nam2[i]=tt;
	}
	for(int c=1;c<=p;c++)
	{
		string tmp;
		for(int i=1;;i++)
		{
			cin>>tmp;
			word[c][i]=tmp;
			if(i==i)
			{
				for(int j=0;j<word[c][i].length();j++)
				{
					if(word[c][i][j]>='a'&&word[c][i][j]<='z')word[c][i][j]-=('a'-'A');
				}
			}
			if(tmp[tmp.length()-1]=='.'||tmp[tmp.length()-1]=='?'||tmp[tmp.length()-1]=='!')break;
		}
		if(word[c][2]=="I"&&word[c][3]=="AM"&&word[c][4]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][1]]].push_back(1);
		if(word[c][2]=="I"&&word[c][3]=="AM"&&word[c][4]=="NOT"&&word[c][5]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][1]]].push_back(-1);
		if(word[c][3]=="IS"&&word[c][4]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][2]+":"]].push_back(1);
		if(word[c][3]=="IS"&&word[c][4]=="NOT"&&word[c][5]=="GUILTY.")f[nam[word[c][1]]][nam[word[c][2]+":"]].push_back(-1);
		if(word[c][2]=="TODAY"&&word[c][3]=="IS")we[nam[word[c][1]]].push_back(change(word[c][4]));
	}
	if(n==1&&f[1][1].size()==0)return cout<<nam2[1],0;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=7;j++)
		{
			int flag[30]={0},okay=1,lier=0;//1 lier;2 honester
			for(int x=1;x<=n&&okay;x++)
			{
				for(int y=1;y<=n&&okay;y++)
				{
					for(int k=0;k<f[x][y].size()&&okay;k++)
					{
						if(flag[x]==1)
						{
							if((y==i&&f[x][y][k]==1)||(y!=i&&f[x][y][k]==-1))okay=0;
						}
						if(flag[x]==2)
						{
							if((y==i&&f[x][y][k]==-1)||(y!=i&&f[x][y][k]==1))okay=0;
						}
						if(flag[x]==0)
						{
							if((y==i&&f[x][y][k]==1)||(y!=i&&f[x][y][k]==-1))
							{
								flag[x]=2;
							}
							else
							{
								flag[x]=1;
								lier++;
							}
						}
					}
				}
			}
			for(int x=1;x<=n;x++)
				{
					for(int k=0;k<we[x].size()&&okay;k++)
					{
						if(flag[x]==1)
						{
							if(we[x][k]==j)okay=0;
						}
						if(flag[x]==2)
						{
							if(we[x][k]!=j)okay=0;
						}
						if(flag[x]==0)
						{
							if(we[x][k]==j)
							{
								flag[x]=2;
							}
							else
							{
								flag[x]=1;
								lier++;
							}
						}
					}
				}
				if(!okay)continue;
				if(lier==m)
				{
					if(ccnt!=0)return cout<<"Cannot Determine",0;
					ccnt++;
					ans=nam2[i];
				}
		}
	}
	if(ccnt==0)
	puts("Impossible");
	else cout<<ans;
}

感谢各位神犇!

2023/10/13 18:16
加载中...