1 条题解
-
0チルノ (9Cirno) LV 7 MOD Baka tayz @ 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
- 通过率
- ?
- 上传者