日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【FZU - 2202】犯罪嫌疑人(思维,假装建图,分类讨论)

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【FZU - 2202】犯罪嫌疑人(思维,假装建图,分类讨论) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題干:

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

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

Input

第一行一個整數T(1 <= T <= 10),表示測試數據的組數。

每組數據第一行包含N(1 <= N <=10^5)和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 Lie Not defined Lie Not defined

解題報告:

這題本來以為是要建圖的,但是其實對于判斷m個人不太好處理,wjh大佬靈光一閃就有了思路。

in1數組記錄有多少個人覺得他犯罪了,in2數組記錄有多少個人覺得他沒犯罪。all1變量記錄總共有多少人的陳述是“犯罪”,all2變量記錄總共有多少人的陳述是“沒犯罪”。那么對于第i個人?x= in1[i]+all2-in2[i]? 就代表? 假設第i個人是犯罪的候選人(因為題目說可,只有一個人犯罪了,但是可能有多個人是“可能犯罪的”,以下稱之為 候選人),那么有x個人說了真話。如果x==m,那么這個就是候選人。我們枚舉每一個人當犯罪者,看通過這個方法可以篩選出多少個候選人。然后分別處理。

如果只有一個候選人,那么就是說謊或者沒說謊就是了。

如果有多個候選人,那么如果某個人說的f[i]那個人不在候選人里面,那這個人肯定要么說謊了要么沒說謊。如果這個人說的f[i]那個人在候選人里面,那么就輸出不確定。

AC代碼:

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<queue> #include<stack> #include<map> #include<set> #include<string> #include<vector> #define mod (1000000007) using namespace std; typedef long long ll; int in1[100100];//犯罪 int in2[100100];//說沒犯罪 int f[100100];//關系 bool ans[100100]; int main() {int t;scanf("%d",&t);while(t--) {int all1=0,all2=0; //總-犯 總-不int n,m;scanf("%d%d",&n,&m);for(int i=1; i<=n; i++) {ans[i]=in1[i]=in2[i]=0;}for(int v,i = 1; i<=n; i++) {scanf("%d",&v);f[i]=v;if(v>0) all1++,in1[v]++;else all2++,in2[-v]++;}int cnt=0;int id;for(int i=1; i<=n; i++) {int tm=in1[i]+all2-in2[i];if(tm==m) {id=i;cnt++;ans[i]=1;}}if(cnt==1) {for(int i=1; i<=n; i++) {if(abs(f[i])==id) { //ans[0])if(f[i]>0) printf("Truth\n");else printf("Lie\n");} else {if(f[i]<0) printf("Truth\n");else printf("Lie\n");}}} else {for(int i=1; i<=n; i++) {if(ans[abs(f[i])]==1) {if(f[i]>0)puts("Not defined");else puts("Not defined");} else {if(f[i]<0) puts("Truth");else puts("Lie");}}}}return 0; }

?

總結

以上是生活随笔為你收集整理的【FZU - 2202】犯罪嫌疑人(思维,假装建图,分类讨论)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。