3 条题解

  • 1
    @ 2026-9-5 19:42:23

    大神牛逼

    • 1
      @ 2026-8-31 0:15:45
      #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
        @ 2025-6-7 20:25:34
        
        #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
        上传者