2 条题解
-
0
#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; }
信息
- ID
- 668
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 49
- 已通过
- 1
- 上传者