求调输入
查看原帖
求调输入
1072846
xingjunlong6789楼主2024/9/26 12:04

新人首蓝求助,使用了getlinegetline,已按照评论区答捞讲的将字符串的最后一个字符删除,经测试输入仍然RE(不是在这个号上测的),代码如下:

#include<bits/stdc++.h>
using namespace std;

const int N=105;
int n,ew,m;
struct E{
	string name;
	vector<string> spe;
	int sus[N]={0};
	int day;
}p[N];

int ord_find(string s)
{
	for(int i=1;i<=n;i++)
		if(s==p[i].name) return i;
	return 0;
}

string name_spa(string e)
{
	int w=0;
	string r;
	while(e[w]!=':') r.push_back(e[w]),w++;
	
	return r;
}

string spe_spa(string r)
{
	int fir=0;
	while(r[fir]!=':') {fir++;} fir++;
	while(r[fir]==' ') {fir++;}
	for(int i=1;i<=fir;i++) r.erase(r.begin()+0);
		
	return r;
}

string s_cut(string w,int l,int r)
{
	string e;
	for(int i=l;i<=r;i++) e.push_back(w[i]);
	
	return e;
}

int p_day(string r)
{
	string day[8]={"","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
	if(s_cut(r,0,8)!="Today is ") return 0;
	
	string w=s_cut(r,9,(int)r.size()-2);
	for(int i=1;i<=7;i++)
		if(w==day[i]) return i;
	
	return 0;
}

int p_gui(string r)
{
	int fir=0;
	while(r[fir]!=' ') {fir++;} fir++;
	
	int sum=0;
	if(s_cut(r,fir,(int)r.size()-1)=="am guilty.") sum=-10;
	else if(s_cut(r,fir,(int)r.size()-1)=="am not guilty.") sum=-20;
	else if(s_cut(r,fir,(int)r.size()-1)=="is guilty.") sum=100;
	else if(s_cut(r,fir,(int)r.size()-1)=="is not guilty.") sum=200;
	
	int ord=ord_find(s_cut(r,0,fir-2));
	if(sum>0) sum+=ord;
	
	return sum;
}

vector<vector<int> > li;

void dfs(int k=0,vector<int> v={})
{
	if((int)v.size()==ew)
	{
		li.push_back(v);
		return ;
	}
	if(k==n) return ;
	
	for(int i=k+1;i<=n;i++)
	{
		v.push_back(i);
		dfs(i,v);
		v.erase(v.end()-1);
	}
}

vector<int> __abs(vector<int> r)
{
	vector<int> w;
	int l=r.size();
	for(int i=1;i<=n;i++)
	{
		int op=0;
		for(int j=0;j<l;j++) if(r[j]==i) op=1;
		if(op) continue;
		w.push_back(i);
	}
	
	return w;
}

bool v_com(vector<int> r)
{
	if(r.empty()) return true;
	
	int l=r.size();
	for(int i=1;i<l;i++)
		if(r[i]!=r[0]) return false;
	
	return true;
}

vector<int> diff(vector<int> r)
{
	r=__abs(r);
	
	vector<int> e;
	int l=r.size();
	for(int i=1;i<=n;i++)
	{
		vector<int> w;
		for(int j=0;j<l;j++)
		{
			if(!p[r[j]].sus[i]) continue;
			w.push_back(p[r[j]].sus[i]);
		}
		if(!v_com(w))
		{
			e.clear();
			return e;
		}
		if(p[r[0]].sus[i]==1) e.push_back(i);
	}
	
	vector<int> w;
	for(int i=0;i<l;i++)
	{
		if(!p[i].day) continue;
		w.push_back(p[i].day);
	}
	if(!v_com(w)) e.clear();
	
	return e;
}

int main()
{
	cin>>n>>ew>>m;
	for(int i=1;i<=n;i++) cin>>p[i].name;
	getchar();
	for(int i=1;i<=m;i++)
	{
		string e;getline(cin,e);
		int ord=ord_find(name_spa(e));
		p[ord].spe.push_back(spe_spa(e));
	}
	
	for(int i=1;i<=n;i++)
	{
		int l=p[i].spe.size(),r;
		for(int j=0;j<l;j++)
		{
			r=p_day(p[i].spe[j]);p[i].day=r;
			r=p_gui(p[i].spe[j]);
			if(r==-10) p[i].sus[i]=1;
			else if(r==-20) p[i].sus[i]=-1;
			else if(r>200) p[i].sus[r%100]=-1;
			else if(r>100) p[i].sus[r%100]=1;
		}
	}
	
	dfs();
	int l=li.size();
	vector<int> r;
	for(int i=0;i<l;i++)
	{
		r.clear();
		r=diff(li[i]);
		if(r.size()) break;
	}
	
	if(r.size()>1) cout<<"Cannot Determine";
	else if(r.size()==0) cout<<"Impossible";
	else cout<<p[r[0]].name;
}
2024/9/26 12:04
加载中...