社区讨论

萌新求助

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

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@mi7z021s
此快照首次捕获于
2025/11/21 05:55
4 个月前
此快照最后确认于
2025/11/21 05:55
4 个月前
查看原帖
CPP
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
using namespace std;
int fake[25],err,w[205],nx;
string name[105],word[205];
string week[8]={"LiuZiJian","Today is Monday.","Today is Tuesday.","Today is Wenesday.","Today is Thursday.","Today is Friday.","Today is Saturday.","Today is Sunday."};
void modi(int who,int yx){(fake[who]&&fake[who]!=yx) ? err=1 : fake[who]=yx;}
int main(){
    int n,m,p;scanf("%d%d%d",&n,&m,&p);
    for(int i=1;i<=m;++i)cin>>name[i];
    for(int i=1;i<=p;++i){
        string nm;cin>>nm;nm.erase(nm.end()-1);
        for(int j=1;j<=m;j++)if(name[j]==nm)w[i]=j;
        getline(cin,word[i]);word[i].erase(word[i].begin());
    }
    for(int td=1;td<=7;td++)
    for(int px=1;px<=m;px++){
        err=0;memset(fake,0,sizeof(fake)); 
        for(int i=1;i<=p;i++){
            int who=w[i];
            if(word[i]=="I am guilty.")modi(who,px==who?1:-1);
            else if(word[i]=="I am not guilty.")modi(who,px!=who?1:-1);
            for(int j=1;j<=7;j++)
            if(word[i]==week[j])modi(who,j==td?1:-1);
            for(int j=1;j<=m;j++){
                if(word[i]==name[j]+" is guilty.")modi(who,j==px?1:-1);
                if(word[i]==name[j]+" is not guilty.")modi(who,j!=px?1:-1);
            }
        }
        int cnt=0,trh=0;
        for(int i=1;i<=m;i++){if(fake[i]==-1)cnt++;if(fake[i]==0)trh++;}
        if(err==0&&cnt<=n&&cnt+trh>=n){
            if(nx&&(nx!=px)){puts("Cannot Determine");return 0;}
            else nx = px;
        }
    }
    if(!nx) puts("Impossible");
    else puts(name[nx].c_str());
    return 0; 
}

回复

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

正在加载回复...