社区讨论

代码求调QAQ

P1039[NOIP 2003 提高组] 侦探推理参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@lo7xyjmx
此快照首次捕获于
2023/10/27 09:35
2 年前
此快照最后确认于
2023/10/27 09:35
2 年前
查看原帖
rt
CPP
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;
string day[20]={
	"114514",
	"Today is Sunday",
	"Today is Monday",
	"Today is Tuesday",
	"Today is Wednesday",
	"Today is Thursday",
	"Today is Friday",
	"Today is Saturday"
};
string say[1000];
string name[1000];

int w[1500];
int vis[2000];
int n,m,p;
string ans;
int main(){
	cin>>m>>n>>p;
	for(int i=1;i<=m;i++){
		cin>>name[i];
	}
	for(int i=1;i<=p;i++){
		string names;
		cin>>names;
		names.erase(names.end()-1);
		for(int j=1;j<=m;j++)
			if(name[j]==names)
				w[i]=j;
		getline(cin,say[i]);
		say[i].erase(say[i].begin());
//		say[i].erase(say[i].end()-1);
	}
	
	for(int td=1;td<=7;td++){
		for(int zf=1;zf<=m;zf++){
			memset(vis,0,sizeof vis);
			int err=0;
			cout<<endl;
			for(int i=1;i<=p;i++){
				int who=w[i];
				if(say[i]=="I am guilty."){
					int temp=vis[who];
					vis[who]=(zf==who)?1:-1;
					if(temp+vis[who]==0)err=1;
//						cout<<1514534523452345<<endl;
				}
				if(say[i]=="I am not guilty."){
					int temp=vis[who]; 
					vis[who]=(zf!=who)?1:-1;
					if(temp+vis[who]==0)err=1;
//						cout<<54234532452;
				}
				for(int j=1;j<=7;j++){
					if(say[i]==day[j]){
						int temp=vis[who];
						vis[who]=(j==td)?1:-1;
						if(vis[who]+temp==0)err=1;
//						cout<<26345634563456346<<endl;
					}
				}
				for(int j=1;j<=m;j++){
					if(say[i]==name[j]+" is guilty."){
						int temp=vis[who];
						vis[who]=(zf==j)?1:-1;
						if(temp+vis[who]==0)err=1;
//						cout<<54234532452<<endl;
					}
					if(say[i]==name[j]+" is not guilty."){
						int temp=vis[who];
						vis[who]=(zf!=j)?1:-1;
						if(temp+(vis[who])==0)err=1;
//						cout<<54234532452;
					}
				}
				if(err)continue;
				int cnt=0,unsure=0;
				for(int i=1;i<=m;i++)
					if(~vis[i])cnt++;
					else if(!vis[i])unsure++;
				if(cnt+unsure>=n && n>=cnt && ans.size()){
					cout<<"Cannot Determine";
					exit(0);
				}
				else if(cnt+unsure>=n && cnt<=n){
					ans=name[who];
				}
				cout<<ans<<endl;
			}
//			cout<<td<<" "<<zf<<" "<<ans<<endl;
		}
	}
	if(ans.size())
		cout<<ans;
	else cout<<"Impossible";
}
这里我判断是否又说真话又说假话是看 vis + usedvis 是否为 0
基本思路和题解1是一样的QAQ但是为啥不对啊(样例都没

回复

1 条回复,欢迎继续交流。

正在加载回复...