[codeforces156B]猜测

来源:互联网 发布:网上买车险软件 编辑:程序博客网 时间:2024/06/08 04:29

大概题意:有m个人说真话 一共n个人 每个人都会指认别人是不是凶手 问哪些人说真话哪些人说假话

这个题还是相当好玩的逻辑题 不过代码细节很恶心……

我们假设一共有sum句话是指认某些人不是的,那么假设对于某一个人【可能】是的话,那么必然会是sum-no[i](指认他不是的)(前两项的和是指认所有别人不是的)+yes[i](指认他是的)==m 这样这个人才有可能是

那么每次我们记录一下

最后输出的时候 假如所有情况已经确定直接输出 否则not define

细节1:无论如何假如一个人指认的确实不是犯人,输出LIE

细节2:无论如何他指认确实不是犯人,输出truth

其实感觉就是取了个非……

#include<cstdio>#include<iostream>#include<algorithm>#include<cmath>#include<cstring>#include<cstdlib>using namespace std;int n,m;int is[100001],isnot[100001];int pointat[100001];int sum=0;inline int init(){int ju=1,now=0;char c;bool flag=false;while(1){c=getchar();if(c=='-')ju=-1;else if(c>='0'&&c<='9'){now=now*10+c-'0';flag=true;}else if(flag)return ju*now;}}bool iscri[100001];int main(){int cnt=0;int x;scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){x=init();pointat[i]=x;if(x>0)is[x]++;else {isnot[-x]++;++sum;}}for(int i=1;i<=n;i++){if(sum-isnot[i]+is[i]==m){++cnt;iscri[i]=true;//假如这个人是犯人不违反规则 }}for(int i=1;i<=n;i++){if(pointat[i]>0){ if(!iscri[pointat[i]]) {printf("Lie\n");//假如无论如何那个人确实不是犯人  } else { if(cnt==1)printf("Truth\n");//假如关系已定 他说的队  else printf("Not defined\n"); }}else{if(iscri[-pointat[i]]){if(cnt!=1)printf("Not defined\n");//同理 else printf("Lie\n");}else{printf("Truth\n");}}}return 0;}


0 0
原创粉丝点击