本地对,洛谷错...
查看原帖
本地对,洛谷错...
220509
国国の国王楼主2020/10/2 13:38
#include<bits/stdc++.h>
using namespace std;
map<string,int> name,tod;
bool think[101][101][3],td[101][8];
int reall[101];
string cn[101],ans="Impossible";
void read(){
	char s=getchar();
	string nam="",f="";
	while(s!=':') nam+=s,s=getchar();
	int p=name[nam];
	s=getchar();
	s=getchar();
	while(s!='\n'){	
		f+=s;
		s=getchar();
		if(name[f]){
			int g=name[f];
			f="";
			s=getchar();
			while(s!='\n'){
				f+=s;
				s=getchar();
			}
			if(f=="is guilty.") think[p][g][1]=1;//1存认为是,0存不认为是 
			if(f=="is not guilty.") think[p][g][0]=1;
			return;
		}
		if(f=="Today is "){
			f="";
			while(s!='\n'){
				f+=s;
				s=getchar();
			}
			td[p][tod[f]]=1;
			return;
		}
	}
	if(f=="I am guilty.") think[p][p][1]=1; 
	if(f=="I am not guilty.") think[p][p][0]=1;
	return;
}
string readword(){
	string f="";
	char s;
	s=getchar();
	while(s!='\n'){
		f+=s;
		s=getchar();
	}
	return f;
}
int main(){
	tod["Sunday."]=1;
	tod["Monday."]=2;
	tod["Tuesday."]=3;
	tod["Wednesday."]=4;
	tod["Thursday."]=5;
	tod["Friday."]=6;
	tod["Saturday."]=7;
	int n,m,p;
	string num;
	cin>>n>>m>>p;
	getchar();
	for(int i=1;i<=n;i++){
		cn[i]=readword();
		name[cn[i]]=i;
	}
	for(int i=1;i<=p;i++) read();
/*
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(think[i][j][1]) cout<<1;
			else if(think[i][j][0]) cout<<2;
			else cout<<0;
		}cout<<endl;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=7;j++){
			cout<<td[i][j];
		}cout<<endl;
	}
*/
	for(int kil=1;kil<=n;kil++){
		for(int today=1;today<=7;today++){
			bool fl=1;
			int fals=0,unk=0;
//			cout<<kil<<' '<<today<<endl;
			for(int i=1;i<=n;i++){
				for(int j=1;j<=7;j++){
					if(td[i][j]){
						if(j==today){//1代表真话,2代表假话,下同 
							if(reall[i]!=2) reall[i]=1;
							else fl=0;
						}else{
							if(reall[i]!=1) reall[i]=2;
							else fl=0;
						}
					}
				}
				for(int j=1;j<=n;j++){
					if((think[i][j][1]&&j==kil)||(think[i][j][0]&&j!=kil)){
						if(reall[i]!=2) reall[i]=1;
						else fl=0;
					}
					if((think[i][j][1]&&j!=kil)||(think[i][j][0]&&j==kil)){
						if(reall[i]!=1) reall[i]=2;
						else fl=0;
					}
				}
				if(reall[i]==2) fals++;
				if(reall[i]==0) unk++;
			}
			if(fals<=m&&fals+unk>=m&&fl){
				if(ans!="Impossible"&&ans!=cn[kil]){
					cout<<"Cannot Determine";
					return 0;
				}
				ans=cn[kil];
			}
		}
	}
	cout<<ans<<endl;
}
2020/10/2 13:38
加载中...