80 pts 求调
查看原帖
80 pts 求调
848194
George222楼主2025/6/23 17:01

如题。测试点 #3 #10 WA。

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

#define pss pair<string, string>
#define mp make_pair
#define gl getline
#define st first
#define nd second

int m, n, p;
string a[25];
pss b[105];

int check2(int t, string glty, string now, string wd)
{
	if (wd == "I am guilty.")
		return glty == now;
	if (wd == "I am not guilty.")
		return glty != now;
	for (int i = 1; i <= m; i++)
	{
		if (wd == (a[i] + " is guilty."))
			return a[i] == glty;
	}
	for (int i = 1; i <= m; i++)
	{
		if (wd == (a[i] + " is not guilty."))
			return a[i] != glty;
	}
	string days[] = {
		"N/A",
		"Today is Monday.",
		"Today is Tuesday.",
		"Today is Wednesday.",
		"Today is Thursday.",
		"Today is Friday.",
		"Today is Saturday.",
		"Today is Sunday."
	};
	for (int i = 1; i <= 7; i++)
	{
		if (wd == days[i])
			return t == i;
	}

	return -1;
}
bool check(int t, string name)
{
	map<string, int> vis;
	for (int i = 1; i <= p; i++)
	{
		pss wd = b[i];
		int ck = check2(t, name, wd.st, wd.nd);
		if (ck == -1)
			continue;
		else if (ck == 1)
		{
			auto it = vis.find(wd.st);
			if (it == vis.end())
				vis[wd.st] = 1;
			else if (vis[wd.st] == 0)
				return false;
		}
		else if (ck == 0)
		{
			auto it = vis.find(wd.st);
			if (it == vis.end())
				vis[wd.st] = 0;
			else if (vis[wd.st] == 1)
				return 0;
		}
	}
	int cnt1, cnt2;
	cnt1 = cnt2 = 0;
	for (int i = 1; i <= m; i++)
	{
		if (vis[a[i]] == 0)
			cnt1++;
		auto it = vis.find(a[i]);
		if (it == vis.end())
			cnt2++;
	}
	return ((cnt1 <= n) && ((cnt1 + cnt2) >= n));
}

int main()
{
	cin >> m >> n >> p;
	for (int i = 1; i <= m; i++)
		cin >> a[i];
	for (int i = 1; i <= p; i++)
	{
		string name, word;
		cin >> name;
		name.erase(name.size() - 1);
		gl(cin, word);
		word.erase(word.begin());
		word.erase(word.end() - 1); 
		b[i] = mp(name, word);
	}
	
	int cnt = 0;
	string ans = "";
	for (int t = 1; t <= 7; t++)
	{
		cnt = 0;
		for (int i = 1; i <= m; i++)
		{
			if (check(t, a[i]))
			{
				cnt++;
				ans = a[i];
			}
		}
		if (cnt > 1)
		{
			cout << "Cannot Determine" << "\n";
			return 0;
		}
	}
	if (ans == "")
		cout << "Impossible" << "\n";
	else
		cout << ans << "\n";
	return 0;
}

测试点 3 如下:

5 1 5
A
B
C
D
E
A: Today is Monday.
B: Today is Thursday.
C: Today is Monday.
B: D is not guilty.
E: I am not guilty.
D

我的程序对测试点 3 输出 Impossible

2025/6/23 17:01
加载中...