/ THO OJ / 题库 / OI杀 /

题解

1 条题解

  • 0
    @ 2024-11-06 20:14:14

    未完成的std

    #include <iostream>
    #include <map>
    #include <cstring>
    using namespace std;
    const int N = 30;
    const string ID[4] = {
        "good guy",
        "bad guy",
        "key person",
        "joker"
    };
    
    struct sent {
        int id; // 说话的人的编号
        string ele; // 内容
    } s[N];
    
    int n, m, p;
    map<string, int> mapping; // 一个由名字到编号的映射
    string name[N]; // 名字
    int ide[N]; // 一个人是否说真话,如果为1则说真话,0则说假话,-1为不确定
    int tr, fl; // 已知说真话和假话的人的数量
    
    bool check(int id, bool flag) { // id为说话人的编号,flag表示这句话是否是假话
        if (ide[id] == -1) { // 假如不能确定他是否说假话
            ide[id] = flag; // 直接赋值
            if (flag) tr++;
            else fl++;
        } else return ide[id] != flag; // 看与之前的判断是否有冲突
        if (tr > m || fl > n - m) return true; // 假如说真话或假话的人过多
        return false;
    }
    
    void judge(int a, int b, int c) { // a, b, c分别代表坏人、关键人,小丑的编号
        memset(ide, -1, sizeof(ide));
        tr = fl = 0; // 初始化
        int pos;
        string name;
        for (int i = 1; i <= p; i++) {
            pos = s[i].ele.find("I am a good guy.");
            if (~pos)
                if (check(s[i].id, (s[i].id != a) & (s[i].id != c)))
                    return;
            pos = s[i].ele.find("I am a bad guy.");
            if (~pos)
                if (check(s[i].id, s[i].id == a))
                    return;
            pos = s[i].ele.find(" is a good guy.");
            if (~pos) {
                name = s[i].ele.substr(0, pos);
                if (check(s[i].id, (mapping[name] != a) & (mapping[name] != c)))
                    return;
            }
            pos = s[i].ele.find(" is a bad guy.");
            if (~pos) {
                name = s[i].ele.substr(0, pos);
                if (check(s[i].id, (mapping[name] == a)))
                    return;
            }
            pos = s[i].ele.find(" is a key guy.");
            if (~pos) {
                name = s[i].ele.substr(0, pos);
                if (check(s[i].id, (mapping[name] == b)))
                    return;
            }
            pos = s[i].ele.find(" is a joker.");
            if (~pos) {
                name = s[i].ele.substr(0, pos);
                if (check(s[i].id, (mapping[name] == c)))
                    return;
            }
        }
    }
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(0), cout.tie(0);
    
        cin >> n >> m >> p;
        for (int i = 1; i <= n; i++) {
            cin >> name[i]; // 输入名字
            mapping[name[i]] = i; // 处理映射
        }
        for (int i = 1; i <= p; i++) {
            string speaker;
            cin >> speaker;
            speaker.erase(speaker.size() - 1, 1); // 删除冒号
            s[i].id = mapping[speaker];
            string ele;
            getline(cin, ele); // 直接获取剩下的一行
            ele.erase(0, 1); // 删除前面的空格
            if (ele[ele.size() - 1] == '\n' || ele[ele.size() - 1] == '\r') ele.erase(ele.size() - 1, 1); // 删除末尾的换行符
            s[i].ele = ele;
        }
    
        for (int i = 1; i <= n; i++)
            for (int j = 1; j <= n; j++)
                for (int k = 1; k <= n; k++)
                    if (i != j && i != k && j != k) judge(i, j, k);
        return 0;
    }
    
    
  • 1

信息

ID
1011
难度
(无)
分类
(无)
标签
(无)
递交数
0
已通过
0
通过率
?
上传者