P1039 [NOIP2003 提高组] 侦探推理

· · 题解

注意事项:

第一句话是真的

第二句话是真的

第三句话是真的

第四句话是假的

第五句话没用

也就是说 MIKE 和 CHARLES 说真话的,KATE 说假话。 符合题意。

当前面这个人说的话和他现在说的不一样时候,一定是不合法的,直接退出。

最好复制题目的星期,因为你不知道你写不写对??

处理字符串时候一定要用 if else 语句,不然就会出现没用的化你算成有用的话,尤其是处理第三,四种操作时候。

别把输入的名字和后面输入话的名字搞混了。

下面贡献几组数据

2 2 4
HELLO
GUILTY
HELLO: What is your name?
GUILTY: I am GUILTY.
GUILTY: Are you guilty?
HELLO: I am not guilty.
HELLO
5 1 5
A
B
C
D
E
A: Today is Monday.
B: Today is Thursday.
C: Today is Monday.
B: D is not guilty.
E: I am not guilty.
D
10 7 20
A
AA
AAA
AAAA
AAAAA
AAAAAA
AAAAAAA
AAAAAAAA
AAAAAAAAA
AAAAAAAAAA
A: Today is Monday.
AA: Today is Monday.
AAA: Today is Monday.
AAAA: Today is Monday.
AAAAA: Today is Monday.
AAAAAA: Today is Monday.
AAAAAAA: Today is Monday.
AAAAAAAA: Today is Sunday.
AAAAAAAAA: Today is Sunday.
AAAAAAAAAA: Today is Sunday.
AAAAAAAAAA: AAA is not guilty.
AAAAAAAAA: A is not guilty.
AAAAAAAA: AAAAA is not guilty.
AAAAAAA: AAAAAA is guilty.
AAAAAA: AAAAAAAAAA is guilty.
AAAAA: AAAAAAAA is guilty.
AAAA: AAAAAAA is guilty.
AAA: AA is guilty.
AA: AAAAAAAAA is guilty.
A: AAAAA is guilty.
AAAA
3 3 3
SAM
SANDY
SUE
SAM: I am not guity. Am I???
SUE: SANDY is guity.
SANDY: SUE is guity.
Cannot Determine

代码

#include <bits/stdc++.h>
#define rep(i, l, r) for(int i = l; i <= r; ++ i)
#define per(i, r, l) for(int i = r; i >= l; -- i)
using namespace std;
const int N = 1000;
int n, m, p;
string name[N], sentence[N];
map<string, int>mp;
struct E{
    string name, name1;
    int id;
    int day;
}e[N];
int solve(int day, int T)
{
    mp.clear();
    rep(i, 1, p)
    {
        if(e[i].id == 1)
        {
            if(e[i].name == name[T])
            {
                if(mp[e[i].name] == 2) return 0;
                mp[e[i].name] = 1;
            }
            else 
            {
                if(mp[e[i].name] == 1) return 0;
                mp[e[i].name] = 2;
            }
        }
        else if(e[i].id == 2) 
        {
            if(e[i].name == name[T])
            {
                if(mp[e[i].name] == 1) return 0;
                mp[e[i].name] = 2;
            }
            else 
            {
                if(mp[e[i].name] == 2) return 0;
                mp[e[i].name] = 1;
            }
        }
        else if(e[i].id == 3)
        {
            if(e[i].name1 == name[T]) 
            {
                if(mp[e[i].name] == 2) return 0;
                mp[e[i].name] = 1;
            }
            else
            {
                if(mp[e[i].name] == 1) return 0;
                mp[e[i].name] = 2; 
            }
        }
        else if(e[i].id == 4)
        {
            if(e[i].name1 == name[T]) 
            {
                if(mp[e[i].name] == 1) return 0;
                mp[e[i].name] = 2;
            }
            else
            {
                if(mp[e[i].name] == 2) return 0;
                mp[e[i].name] = 1; 
            }
        }
        else if(e[i].id == 5)
        {
            if(day == e[i].day)
            {
                if(mp[e[i].name] == 2) return 0;
                mp[e[i].name] = 1;
            }
            else
            {
                if(mp[e[i].name] == 1) return 0;
                mp[e[i].name] = 2; 
            }
        }
    }
    int tot = 0, tot1 = 0, tot2 = 0;
    rep(i, 1, m)
    {
        if(mp[name[i]] == 1) ++ tot;
        else if(mp[name[i]] == 2) ++ tot1;
        else ++ tot2;
    }
    if(tot1 > n) return 1;
    if(tot1 + tot2 >= n) return 2;
    return 0;
}
main()
{
    cin >> m >> n >> p; 
    string sssss;
    getline(cin,sssss);
    rep(i, 1, m)  
    {
        getline(cin, sssss);
        rep(j, 0, (int)sssss.size() - 1) if(sssss[j] != '\n' && sssss[j] != '\r') name[i] += sssss[j];
    }
    rep(i, 1, p) 
    {
        getline(cin, sssss);
        rep(j, 0, (int)sssss.size() - 1) if(sssss[j] != '\n' && sssss[j] != '\r') sentence[i] += sssss[j];
        rep(j, 1, m) 
        {
            string s = "";
            for(int k = 0; sentence[i][k] != ':'; ++ k) s += sentence[i][k];
            if(name[j] == s) 
            {
                e[i].name = name[j];
                string ss = "";
                rep(k, (int)name[j].size() + 2, (int)sentence[i].size() - 1) ss += sentence[i][k];
                if(ss == "I am guilty.") e[i].id = 1;
                else if(ss == "I am not guilty.") e[i].id = 2;
                else
                {
                    string sss = "";
                    rep(k, 0, 7) sss += ss[k];
                    if(sss == "Today is")
                    {
                        e[i].id = 5;
                        string ssss = "";
                        rep(k, 9, (int)ss.size() - 2) ssss += ss[k];
                        if(ssss == "Monday") e[i].day = 1;
                        if(ssss == "Tuesday") e[i].day = 2;
                        if(ssss == "Wednesday") e[i].day = 3;
                        if(ssss == "Thursday") e[i].day = 4;
                        if(ssss == "Friday") e[i].day = 5;
                        if(ssss == "Saturday") e[i].day = 6;
                        if(ssss == "Sunday") e[i].day = 7;
                    }
                    else
                    {
                        rep(k, 1, m)
                        {
                            string sss = "";
                            for(int l = 0; ss[l] != ' '; ++ l) sss += ss[l];
                            if(sss == name[k])
                            {
                                string ssss = "";
                                rep(h, (int)name[k].size() + 1, (int)ss.size() - 2) ssss += ss[h];
                                if(ssss == "is guilty") e[i].id = 3, e[i].name1 = sss;
                                else if(ssss == "is not guilty") e[i].id = 4, e[i].name1 = sss;
                                break;
                            }
                        }
                    }
                }
                break;
            }
        }
    }
    string ss = "";
    rep(i, 1, 7) rep(j, 1, m) 
    {
        int x = solve(i, j);
        if(x == 2) 
        {
            if(ss != "" && ss != name[j]) cout << "Cannot Determine", exit(0);
            ss = name[j]; 
        }
    }
    cout << (ss == "" ? "Impossible" : ss);
}