30pts求条
查看原帖
30pts求条
1345783
BK小鹿楼主2024/7/7 11:56

rt

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <unordered_map>
#include <vector>

using namespace std;

const int N = 1005;
const string wd[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

int m, n, p;
string names[N];
unordered_map<string, int> id;
pair<string, string> sen[N];
bool hon[N];

int judge(int day, int guy, string name, string content)
{
    int k = id[name];
    if (content == "I am guilty.")
    {
        if (k == guy)  return 1;
        return 2;
    }
    if (content == "I am not guilty.")
    {
        if (k != guy)  return 1;
        return 2;
    }
    for (int i = 0; i < m; i++)
        if (names[i] + " is guilty." == content)
        {
            if (i == guy)  return 1;
            else return 2;
        }
    for (int i = 0; i < m; i++)
        if (names[i] + " is not guilty." == content)
        {
            if (i == guy) return 2;
            else return 1;
        }
    for (int i = 0; i < 7; i++)
        if ("Today is " + wd[i] + "." == content)
        {
            if (i == day)  return 1;
            else return 2;
        }
    return 0;
}

bool check(int day, int guy)
{
    for (int i = 0; i < p; i++)
    {
        string name = sen[i].first, content = sen[i].second;
        int k = id[name];
        hon[k] |= judge(day, guy, name, content);
    }
    
    int lie = 0, truth = 0;
    for (int i = 0; i < m; i++)
        if (hon[i] == 3)  return false;
        else if (hon[i] == 1)  truth++;
        else if (hon[i] == 2)  lie++;
    return lie <= n && truth <= m - n;
}

int main()
{
    scanf("%d%d%d", &m, &n, &p);
    for (int i = 0; i < m; i++)
    {
        cin >> names[i];
        id[names[i]] = i;
    }
    
    for (int i = 0; i < p; i++)
    {
        string name, content;
        cin >> name;
        name.pop_back();
        getline(cin, content);
        content.erase(content.begin());
        if (content.back() == '\r') content.pop_back();
        sen[i] = {name, content};
    }
    
    vector<string> guys;
    for (int day = 0; day < 7; day++)
    {
        for (int i = 0; i < m; i++)
        {
            if (check(day, i)) 
                guys.push_back(names[i]);
        }
        
        if (!guys.empty())  break;
    }
    
    if (guys.empty())  cout << "Impossible";
    else if (guys.size() > 1)  cout << "Cannot Determine";
    else cout << guys[0];
    
    return 0;
}
2024/7/7 11:56
加载中...