水题求条
  • 板块学术版
  • 楼主BK小鹿
  • 当前回复2
  • 已保存回复3
  • 发布时间2024/7/6 15:53
  • 上次更新2024/7/6 17:36:40
查看原帖
水题求条
1345783
BK小鹿楼主2024/7/6 15:53

rt,样例都过不了,感觉思路没问题

WA Code

#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;
            return 2;
        }
    for (int i = 0; i < m; i++)
        if (names[i] + " is not guilty." == content)
        {
            if (i != guy) return 1;
            return 2;
        }
    for (int i = 0; i < 7; i++)
        if ("Today is " + wd[i] + "." == content)
        {
            if (i == day)  return 1;
            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.back() == '\n') 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.size())  break;
    }
    
    if (guys.empty())  cout << "Impossible";
    else if (guys.size() > 1)  cout << "Cannot Determine";
    else cout << guys[0];
    
    return 0;
}

题目

2024/7/6 15:53
加载中...