样例没过求助
查看原帖
样例没过求助
338147
01bit楼主2021/7/1 15:47
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<utility>
using namespace std;
string c2s(char* strc){
	string strs;
	for(int i=0;i<strlen(strc);i++)strs[i]=strc[i];
	return strs;
}
int n,m,p;
string name[25];
map<string,int>namelink;
int saids[255][2];
int saidtonum(string said){
	if(said=="I am guilty.")return 8;
	if(said=="I am not guilty.")return 9;
	if(said=="Today is Monday.")return 1;
	if(said=="Today is Tuesday.")return 2;
	if(said=="Today is Wednesday.")return 3;
	if(said=="Today is Thursday.")return 4;
	if(said=="Today is Friday.")return 5;
	if(said=="Today is Saturday.")return 6;
	if(said=="Today is Sunday.")return 7;
	for(int i=0;i<n;i++)if(said==name[i]+"is guilty.")return 10+i;
	for(int i=0;i<n;i++)if(said==name[i]+"is not guilty.")return -1-i;
	return 0;
}
int lj=-1;
int main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m>>p;
	for(int i=0;i<n;i++){
		cin>>name[i];
		namelink[name[i]]=i;
	}
	for(int i=0;i<p;i++){
		string str;
		getline(cin,str);
		char cs[255],s1[255],s2[255];
		strcpy(cs,str.c_str());
		sscanf(cs,"%s: %s",&s1,&s2);
		string ss1=c2s(s1),ss2=c2s(s2);
		saids[i][0]=namelink[ss1];
		saids[i][1]=saidtonum(ss2);
	}
	for(int i=1;i<=7;i++){
		for(int j=0;j<n;j++){
			int saidtrue[25]={};
			bool err=0;
			for(int k=0;k<n;k++){
				int anthor=saids[k][0],said=saids[k][1];
				int isok=0;
				if(said<0)
					if(-said-1==j)isok=-1;
					else isok=1;
				else if(said==0) continue;
				else if(said<8)
					if(said==i)isok=1;
					else isok=-1;
				else if(said<10)
					if(said==8)
						if(anthor==j)isok=1;
						else isok=-1;
					else
						if(anthor==j)isok=-1;
						else isok=1;
				else
					if(said-10==j)isok=1;
					else isok=-1;
				if(isok)
					if(saidtrue[anthor]){
						if(saidtrue[anthor]!=isok)err=1;
					}else saidtrue[anthor]=isok;
			}
			int fake=0,nknow=0;
			for(int k=0;k<n;k++){
				if(saidtrue[k]==-1)fake++;
				if(saidtrue[k]==0)nknow++;
			}
			if(!err&&fake<=m&&fake+nknow>=m)
				if(lj!=-1){
					cout<<"Cannot Determine";
					return 0;
				}else lj=j;
		}
	}
	if(lj==-1)cout<<"Impossible";
	else cout<<name[lj];
	return 0;
}

2021/7/1 15:47
加载中...