30pts求条
查看原帖
30pts求条
876371
sksksksk楼主2025/7/24 10:49
30pts求条

https://www.luogu.com.cn/record/226471340

#include<bits/stdc++.h>
using namespace std;
string sy[110],nm[110];
string day[10]={"","Today is Monday.","Today is Tuesday.","Today is Wednesday.","Today is Thursday.","Today is Friday.","Today is Saturday.","Today is Sunday."};
bool f;
int n,m,p,wh[110],cim,ho[110];
void tru(int i){
	if(ho[wh[i]]!=-1)
	  ho[wh[i]]=1;else
	  f=1;
}
void fal(int i){
	if(ho[wh[i]]!=1)
	  ho[wh[i]]=-1;else
	  f=1;
}
int main(){
	cin>>m>>n>>p;
	for(int i=1;i<=m;i++)
	  cin>>nm[i];
	for(int i=1;i<=p;i++){
		string sn;
		cin>>sn;
		sn.erase(sn.end()-1);
		for(int j=1;j<=m;j++)
		  if(nm[j]==sn)
		    wh[i]=j;
		getline(cin,sy[i]);
		sy[i].erase(sy[i].begin());
	}
	for(int td=1;td<=7;td++)
		for(int cr=1;cr<=m;cr++){
			f=0;
			memset(ho,0,sizeof(ho));
			for(int i=1;i<=p;i++){
				if(sy[i]=="I am guilty."){
					if(cr==wh[i])
					  tru(i);else
					  fal(i);
				}
				if(sy[i]=="I am not guilty."){
					if(cr==wh[i])
					  fal(i);else
					  tru(i);
				}
				for(int j=1;j<=7;j++){
					if(sy[i]==day[i])
					  if(j==td)
					    tru(i);else
					    fal(i);
				}
				for(int j=1;j<=m;j++){
					if(sy[i]==nm[j]+" is guilty."){
						if(cr==j)
						  tru(i);else
						  fal(i); 
					}
					if(sy[i]==nm[j]+" is not guilty."){
						if(cr==j)
						  fal(i);else
						  tru(i); 
					}
				}
			}
			int fs=0,ds=0;
			for(int i=1;i<=m;i++){
			  if(ho[i]==-1)
			    fs++;
			  if(ho[i]==0)
			    ds++;
			}
			if(f==0&&fs<=n&&fs+ds>=n)
			  if(cim!=0&&cim!=cr){
			  	cout<<"Cannot Determine";
			  	return 0;
			  }else
			  cim=cr;
		}
	if(cim==0)
	  cout<<"Impossible";else
	  cout<<nm[cim];
}
2025/7/24 10:49
加载中...