3 条题解
-
1
#include <iostream> #include <string> #include <vector> #include <set> #include <map> #include <cstdio> using namespace std; string DAYS[] = {"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; struct Statement { int type; int target; }; int main() { freopen("logic.in", "r", stdin); freopen("logic.out", "w", stdout); ios::sync_with_stdio(false); cin.tie(nullptr); int M, N, P; if (!(cin >> M >> N >> P)) return 0; vector<string> names(M); map<string, int> nameToId; for (int i = 0; i < M; i++) { cin >> names[i]; nameToId[names[i]] = i; } string dummy; getline(cin, dummy); vector<pair<int, Statement>> stmts; for (int i = 0; i < P; i++) { string line; if (!getline(cin, line)) break; if (!line.empty() && line.back() == '\r') line.pop_back(); string::size_type pos = line.find(": "); if (pos == string::npos) continue; string speaker = line.substr(0, pos); string content = line.substr(pos + 2); auto it = nameToId.find(speaker); if (it == nameToId.end()) continue; int sid = it->second; Statement st; st.type = 0; st.target = -1; if (content == "I am guilty.") { st.type = 1; } if (st.type == 0 && content == "I am not guilty.") { st.type = 2; } if (st.type == 0 && content.size() >= 9 && content.substr(0, 9) == "Today is ") { string day = content.substr(9); if (!day.empty() && day.back() == '.') day.pop_back(); for (int d = 0; d < 7; d++) { if (day == DAYS[d]) { st.type = 5; st.target = d; break; } } } if (st.type == 0 && content.size() >= 15 && content.substr(content.size() - 15) == " is not guilty.") { string name = content.substr(0, content.size() - 15); auto it2 = nameToId.find(name); if (it2 != nameToId.end()) { st.type = 4; st.target = it2->second; } } if (st.type == 0 && content.size() >= 11 && content.substr(content.size() - 11) == " is guilty.") { string name = content.substr(0, content.size() - 11); auto it2 = nameToId.find(name); if (it2 != nameToId.end()) { st.type = 3; st.target = it2->second; } } if (st.type != 0) { stmts.push_back({sid, st}); } } set<int> suspects; for (int crim = 0; crim < M; crim++) { for (int day = 0; day < 7; day++) { vector<int> status(M, -1); bool ok = true; for (int j = 0; j < (int)stmts.size(); j++) { int sid = stmts[j].first; const Statement& st = stmts[j].second; bool isTrue; switch (st.type) { case 1: isTrue = (sid == crim); break; case 2: isTrue = (sid != crim); break; case 3: isTrue = (st.target == crim); break; case 4: isTrue = (st.target != crim); break; case 5: isTrue = (st.target == day); break; default: continue; } int s = isTrue ? 0 : 1; if (status[sid] == -1) { status[sid] = s; } else if (status[sid] != s) { ok = false; break; } } if (!ok) continue; int liars = 0, freeCnt = 0; for (int i = 0; i < M; i++) { if (status[i] == 1) liars++; else if (status[i] == -1) freeCnt++; } if (liars <= N && N <= liars + freeCnt) { suspects.insert(crim); break; } } } if (suspects.size() == 1) { cout << names[*suspects.begin()] << endl; } else if (suspects.size() > 1) { cout << "Cannot Determine" << endl; } else { cout << "Impossible" << endl; } return 0; } -
-2
#include <iostream> #include <vector> #include <map> #include <sstream> #include <algorithm> using namespace std; struct Statement { string speaker; string content; }; vector<string> split(const string &s, char delim) { vector<string> tokens; string token; istringstream iss(s); while (getline(iss, token, delim)) if (!token.empty()) tokens.push_back(token); return tokens; } bool isGuiltyStatement(const string &content, const string &suspect) { if (content == "I am guilty.") return true; vector<string> parts = split(content, ' '); if (parts.size() >= 3 && parts[1] == "is" && parts[2] == "guilty.") return parts[0] == suspect; return false; } bool checkScenario(int M, int N, const vector<string> &names, const vector<Statement> &statements, const string &suspect) { map<string, bool> isLiar; // true表示说谎者 // 检查每个陈述的真假 for (const auto &stmt : statements) { bool truthValue = isGuiltyStatement(stmt.content, suspect); if (stmt.speaker == suspect) truthValue = !truthValue; // 凶手总说谎 if (!truthValue) isLiar[stmt.speaker] = true; } // 验证说谎人数是否符合 int liarCount = 0; for (const auto &name : names) if (isLiar[name]) liarCount++; return liarCount == N; } int main() { int M, N, P; cin >> M >> N >> P; cin.ignore(); vector<string> names(M); for (int i = 0; i < M; ++i) getline(cin, names[i]); vector<Statement> statements(P); for (int i = 0; i < P; ++i) { string line; getline(cin, line); size_t pos = line.find(": "); statements[i].speaker = line.substr(0, pos); statements[i].content = line.substr(pos + 2); } vector<string> possibleSuspects; for (const auto &suspect : names) { if (checkScenario(M, N, names, statements, suspect)) possibleSuspects.push_back(suspect); } if (possibleSuspects.empty()) { cout << "Impossible" << endl; } else if (possibleSuspects.size() > 1) { cout << "CannotDetermine" << endl; } else { cout << possibleSuspects[0] << endl; } return 0; }
- 1
信息
- ID
- 668
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 51
- 已通过
- 3
- 上传者