【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 -1Sample 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】犯罪嫌疑人(思维,假装建图,分类讨论)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Stacmon.exe - Stacmo
- 下一篇: 【牛客 - 369A】小D的剧场(线性d