NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)

尼玛!!我做完这道题整个人都不淡定了好不!!!!

题目大意:给定m个人,其中n个人在说谎,给出这m个人的p句话,找出凶手

我不是来发题解的!这题就是水题!我是来吐槽数据的!!!!

首先让我们来看这句话。


我、我。。。

这只是噩梦的开始。我们来看样例


其实这样例很正常不是么?其实如果我们1A了这道题,那么一切就结束了。可是呢?当我们心烦意乱地打开数据的时候,我们愁云不展的浓眉就会立刻变成捧腹巨笑——

input0.txt

NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)_第1张图片

很好,很好,两个逗比。但是我们还不要急着笑,我们来看下一组。

NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)_第2张图片

可怜的H君 当ABCDEFG相继指责着他们的下家时,深爱着I君的H君不忍心坑害他的恋人,于是忍着被怀疑为凶手的危险,向I君发出了最后的爱的轻语,却殊不知杀人真凶却是他最爱的那个小I。。。

等等我是不是看到了什么?



嘛嘛我们再来看这组。

NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)_第3张图片

Am I???

Am I???

Am I???

然后。。。你看到guity了么??你看到guity了么?这是个什么单词?我不认识他!!Do I??Do I???


双重否定句!!高大上!!高大上啊有木有!!

这题中的嫌疑人也是各种神经病

NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)_第4张图片

神经病的凶手


神经病的父母

NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)_第5张图片

神经病的出题人

最后我们这些做题人也变成神经病了有木有啊啊啊啊啊啊啊啊啊!!!!!

啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊 啊啊啊啊啊啊啊!!!!!





















按照惯例,我现在应该贴代码了。不,我偏不。在这篇文章的最后,我要献上指尖流淌的一段文字,来表述我最后的真情

NOIP2003 第二题 侦探推理 ——论世界上最逗比的出(da)题(shei)人(bi)_第6张图片

曾经有一段真挚的爱情放在我面前,我却没有珍惜。等到失去了以后,才追悔莫及。人世间最痛苦的事莫过于此。如果上天能给我一个再来一次的机会,我会对那个女孩子说,I love you!If there must be a deadline,I hope it is 10000 years!!!

Merry Teachers' Day !!! And Happy New Year !!! Wish You A Healthy Body ! We'd Meet Again Someday !! Good Bye !! Nyan-hahahahahah !!!!

#include<map>
#include<string>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
map <string,int> a;
int m,n,p,cnt;
char s[1000];
int master[21];
string names[21];
string sentences[21];
const string days[7]={
    "Today is Monday.",
    "Today is Tuesday.",
    "Today is Wednesday.",
    "Today is Thursday.",
    "Today is Friday.",
    "Today is Saturday.",
    "Today is Sunday."
};
int ans,true_or_false[21],num[2];
bool Set_True_Or_False(int x,bool flag)
{
    if(true_or_false[x]==-1)
        true_or_false[x]=flag,num[flag]++;
    else if(true_or_false[x]==flag)
        return 0;
    else return 1;
    if(num[0]>n||num[1]>m-n)
        return 1;
    return 0;
}
void Judge(int x,string y)
{
    int i,pos,suspect;
    memset(true_or_false,0xff,sizeof true_or_false);
    num[0]=num[1]=0;
    for(i=1;i<=p;i++)
    {
        if(sentences[i]=="I am guilty.")
        {
            if(master[i]==x){
                if( Set_True_Or_False(master[i],true) )
                    return ;
            }else{
                if( Set_True_Or_False(master[i],false) )
                    return ;
            }
        }
        else if(sentences[i]=="I am not guilty.")
        {
            if(master[i]==x){
                if( Set_True_Or_False(master[i],false) )
                    return ;
            }else{
                if( Set_True_Or_False(master[i],true) )
                    return ;
            }
        }
        else if( pos=sentences[i].find(" is guilty"),~pos )
        {
            sentences[i].erase(pos,11);
            if(suspect=a[sentences[i]])
            {
                if(suspect==x){
                    if( Set_True_Or_False(master[i],true) )
                    {
                        sentences[i].insert(pos," is guilty.");
                        return ;
                    }
                }else{
                    if( Set_True_Or_False(master[i],false) )
                    {
                        sentences[i].insert(pos," is guilty.");
                        return ;
                    }
                }
            }
            sentences[i].insert(pos," is guilty.");
        }
        else if( pos=sentences[i].find(" is not guilty"),~pos )
        {
            sentences[i].erase(pos,15);
            if(suspect=a[sentences[i]])
            {
                if(suspect==x){
                    if( Set_True_Or_False(master[i],false) )
                    {
                        sentences[i].insert(pos," is not guilty.");
                        return ;
                    }
                }else{
                    if( Set_True_Or_False(master[i],true) )
                    {
                        sentences[i].insert(pos," is not guilty.");
                        return ;
                    }
                }
            }
            sentences[i].insert(pos," is not guilty.");
        }
        else if( pos=sentences[i].find("Today is "),~pos )
        {
            if(sentences[i]==y){
                if( Set_True_Or_False(master[i],true) )
                    return ;
            }else{
                if( Set_True_Or_False(master[i],false) )
                    return ;
            }
        }
    }
    if(ans&&ans!=x)
    {
        puts("Cannot Determine");
        exit(0);
    }
    ans=x;
}
int main()
{
    int i,j;
    cin>>m>>n>>p;
    gets(s);
    for(i=1;i<=m;i++)
        names[i]=gets(s),
        a[ names[i] ]=++cnt;
    for(i=1;i<=p;i++)
    {
        scanf("%s",s);
        s[strlen(s)-1]=0;
        master[i]=a[(string)s];
        getchar();
        sentences[i]=gets(s);
    }
    for(i=1;i<=m;i++)
        for(j=0;j<7;j++)
            Judge(i,days[j]);
    if(!ans)
        puts("Impossible");
    else
        cout<<names[ans]<<endl;
}


你可能感兴趣的:(数据)