先假设第i个嫌疑犯是罪犯,看此时说真话的人满不满足m个,若满足,则此假设成立。由于只有一个罪犯。。。故可判定。。。。。。
<span style="font-size:14px;">#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
#define inf 0x7fffffff
#define Maxn 100010
int a[Maxn],f1[Maxn],f2[Maxn],f[Maxn]; //f1[i]记录猜第i个人为罪犯的人数,f2[i]记录猜第i个人不是罪犯的人数
int main()
{
int m,n,i,j,k,no;
while(scanf("%d %d",&n,&m)!=EOF){
memset(f,0,sizeof(f));
memset(f1,0,sizeof(f1));
memset(f2,0,sizeof(f2));
no=0;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[i]>0){
f1[a[i]]++;
}
else{
f2[-a[i]]++;
no++;
}
}
k=0;
for(i=1;i<=n;i++){
if(f1[i]+no-f2[i]==m){
f[i]=1; //i为罪犯时,满足说真话的人有m个这一条件
k++;
}
}
for(i=1;i<=n;i++){
if(a[i]>0){
if(f[a[i]]&&k==1) printf("Truth\n"); //a[i]为罪犯时满足条件,且满足条件的只有1人
else if(!f[a[i]]) printf("Lie\n"); //a[i]为罪犯时不满足条件
else printf("Not defined\n");
}
else{
if(!f[-a[i]]) printf("Truth\n");
else if(f[-a[i]]&&k==1) printf("Lie\n");
else printf("Not defined\n");
}
}
}
//system("pause");
return 0;
} </span>