FZU2202 犯罪嫌疑人(邏輯推理 模擬)

2021-09-16 12:51:38 字數 1379 閱讀 7958

福爾摩斯是個大偵探,他總是在解決疑難案件。這一次的案件也不例外,案件是這樣的:有編號為1到n的n位嫌疑犯,他們其中有乙個犯了罪,然後每個嫌疑犯都被詢問,「哪乙個人犯了罪?」犯罪嫌疑人的答案只能「編號ai的嫌疑犯犯了罪」或者「編號ai的嫌疑犯沒有犯罪」。當然嫌疑犯也可以說他自己(ai = i).

福爾摩斯憑著他敏銳的偵探直覺,確定地對華生說,只有m個人說了真話,其餘人都是說謊。然後就沒有然後了,但華生卻想知道哪些人說謊哪些人又是講真話。這個時候同樣聰明的你,被譽為紅旗下的名偵探是否願意秀一下自己的偵探天賦,幫助可憐的華生嘛?

input

第一行乙個整數t(1≤t≤10),表示測試資料的組數。

每組資料第一行包含n(1≤n≤105)和m(0≤m≤n)兩個整數,含義見題面。接下來n行,第i行是乙個整數+ai或者-ai(1≤ai≤n),如果是+ai,代表第i個人說編號ai犯了罪,如果是-ai,則表示編號ai沒有犯罪。

輸入資料保證至少存在乙個人,使得如果是他犯了罪,則恰好有 m 個人說了真話。

output

輸出為n行,第i行是第i個嫌疑犯的輸出。如果第i個嫌疑犯說了是真話,輸出「truth」;如果說謊,則輸出「lie」,如果不確定,則輸出「not defined」。

sample input

2

3 2-1

-2-3

4 1+2

-3+4

-1

sample output

not defined

not defined

not defined

lienot defined

lienot defined

#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int n=1e5+5;

int a,b;//a個正號,b個負號

int a[n];//a[i]表示說i是犯罪的人的數量

int b[n];//b[i]表示說i不是罪犯的人的數量

int c[n];//c[i]表示假設i是罪犯,符合條件

int x[n];//每個人說的話

int main()

else

} int cnt=0;

int id;//罪犯id

for(int i=1;i<=n;i++)

} if(cnt==1)

else

}} else

else

}} }

return 0;

}

FZU2202 犯罪嫌疑人

problem 2202 犯罪嫌疑人 福爾摩斯是個大偵探,他總是在解決疑難案件。這一次的案件也不例外,案件是這樣的 有編號為1到n的n位嫌疑犯,他們其中有乙個犯了罪,然後每個嫌疑犯都被詢問,哪乙個人犯了罪?犯罪嫌疑人的答案只能 編號ai的嫌疑犯犯了罪 或者 編號ai的嫌疑犯沒有犯罪 當然嫌疑犯也可以...

fzu2202犯罪嫌疑人 邏輯判斷

假設i是犯人,則說真話的人數 說i是犯人的人數 說某人不是犯人的人數 說i不是犯人的人數 若i說x是犯人,x可能是犯人時,i說的可能是真話也可能是假話 x不可能是犯人時,i說的必為假話 若i說x不是犯人,x可能是犯人時,i說的可能是真話也可能是假話 x不可能是犯人時,i說的必為真話 include ...

G FZU2022 犯罪嫌疑人

這道題題意很清楚,是推理題,主要靠思維,部分比較簡單。以下是解題思路 按照 順序編寫,可以對照著看 a i 表示第i個人被指控的次數,a i 表示地i個人被澄清的次數,suspect i 表示第i個人是否為嫌疑人,tmp記錄那個人的口供。現在假設第i個人是罪犯,則xx a i b b i 為所真話的...