社区讨论

本地评测与在线评测结果不一致

P1039[NOIP 2003 提高组] 侦探推理参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@m02dveup
此快照首次捕获于
2024/08/20 20:10
2 年前
此快照最后确认于
2025/11/04 22:55
4 个月前
查看原帖
rt
CPP
#include <map>
#include <cstring>
#include <iostream>
using namespace std;

int m, n, p;
map<string, int> num;
string s[2][105], name[25];
string crime = "Impossible";
string D[10] = {
    "",
    "Monday.",
    "Tuesday.",
    "Wednesday.",
    "Thursday.",
    "Friday.",
    "Saturday.",
    "Sunday.",
};
int status[25];

int main()
{
    cin >> m >> n >> p;
    for (int i = 1; i <= m; i++)
    {
        cin >> name[i];
        num.insert(make_pair(name[i], i));
    }
    getline(cin, s[1][0]);
    for (int i = 1; i <= p; i++)
    {
        getline(cin, s[1][i]);
        int len = s[1][i].length();
        for (int j = 0; j < len; j++)
        {
            if (s[1][i][j] == ':')
            {
                s[0][i] = s[1][i].substr(0, j);
                s[1][i] = s[1][i].substr(j + 2);
                break;
            }
        }
    }
    for (int i = 1; i <= m; i++)
    {
        for (int day = 1; day < 8; day++)
        {
            bool flag = 1;
            int T = 0, F = 0;
            for (int j = 1; j <= m; j++)
                status[j] = -1;

            for (int j = 1; j <= p && flag; j++)
            {
                if (F > n || T > m - n)
                {
                    flag = 0;
                    break;
                }
                if (s[1][j] == "I am not guilty.")
                {
                    if (num[s[0][j]] != i)
                    {
                        if (status[num[s[0][j]]] == 0)
                            flag = 0;
                        else if (status[num[s[0][j]]] == -1)
                        {
                            T++;
                            status[num[s[0][j]]] = 1;
                        }
                    }
                    else
                    {
                        if (status[num[s[0][j]]] == 1)
                            flag = 0;
                        else if (status[num[s[0][j]]] == -1)
                        {
                            F++;
                            status[num[s[0][j]]] = 0;
                        }
                    }
                }
                else if (s[1][j] == "I am guilty.")
                {
                    if (num[s[0][j]] == i)
                    {
                        if (status[num[s[0][j]]] == 0)
                            flag = 0;
                        else if (status[num[s[0][j]]] == -1)
                        {
                            T++;
                            status[num[s[0][j]]] = 1;
                        }
                    }
                    else
                    {
                        if (status[num[s[0][j]]] == 1)
                            flag = 0;
                        else if (status[num[s[0][j]]] == -1)
                        {
                            F++;
                            status[num[s[0][j]]] = 0;
                        }
                    }
                }
                else
                {
                    int f[3] = {int(s[1][j].find("Today is ")), int(s[1][j].find("is guilty.")), int(s[1][j].find("is not guilty."))};
                    if (f[0] == 0)
                    {
                        int find_day = 0;
                        for (int k = 1; k <= 7; k++)
                        {
                            if (s[1][j].find(D[k]) == 9)
                            {
                                find_day = k;
                                break;
                            }
                        }
                        if (find_day == day)
                        {
                            if (status[num[s[0][j]]] == 0)
                                flag = 0;
                            else if (status[num[s[0][j]]] == -1)
                            {
                                T++;
                                status[num[s[0][j]]] = 1;
                            }
                        }
                        else if (find_day)
                        {
                            if (status[num[s[0][j]]] == 1)
                                flag = 0;
                            else if (status[num[s[0][j]]] == -1)
                            {
                                F++;
                                status[num[s[0][j]]] = 0;
                            }
                        }
                    }
                    else if (f[1] != string::npos)
                    {
                        auto iter = num.find(s[1][j].substr(0, f[1] - 1));
                        if (iter != num.end())
                        {
                            if (iter->second == i)
                            {
                                if (status[num[s[0][j]]] == 0)
                                    flag = 0;
                                else if (status[num[s[0][j]]] == -1)
                                {
                                    T++;
                                    status[num[s[0][j]]] = 1;
                                }
                            }
                            else
                            {
                                if (status[num[s[0][j]]] == 1)
                                    flag = 0;
                                else if (status[num[s[0][j]]] == -1)
                                {
                                    F++;
                                    status[num[s[0][j]]] = 0;
                                }
                            }
                        }
                    }
                    else if (f[2] != string::npos)
                    {
                        auto iter = num.find(s[1][j].substr(0, f[2] - 1));
                        if (iter != num.end())
                        {
                            if (iter->second != i)
                            {
                                if (status[num[s[0][j]]] == 0)
                                    flag = 0;
                                else if (status[num[s[0][j]]] == -1)
                                {
                                    T++;
                                    status[num[s[0][j]]] = 1;
                                }
                            }
                            else
                            {
                                if (status[num[s[0][j]]] == 1)
                                    flag = 0;
                                else if (status[num[s[0][j]]] == -1)
                                {
                                    F++;
                                    status[num[s[0][j]]] = 0;
                                }
                            }
                        }
                    }
                }
            }
            if (F > n || T > m - n)
                flag = 0;
            if (flag)
            {
                if (crime != "Impossible" && crime != name[i])
                {
                    cout << "Cannot Determine" << endl;
                    return 0;
                }
                else
                    crime = name[i];
            }
        }
    }
    cout << crime << endl;
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...