福爾摩斯是個大偵探,他總是在解決疑難案件。這一次的案件也不例外,案件是這樣的:有編號為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
2sample output3 2-1
-2-3
4 1+2
-3+4
-1
not definednot 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 為所真話的...