FZU 2202——犯罪嫌疑人——————【思维题】
解题思路:首先根据说真话的有m个,我们可以首先统计出来可能的嫌疑人有多少个,标记出来。1.当可能的嫌疑人只有1个,那么某人说嫌疑人是他的时候,话是真的,否则是假的。某人说其他人是嫌疑人的时候,话是假的,否则是真的。2.当可能的嫌疑人有多个的时候,然后枚举每个人说的话。如果某个人说一个人XX是嫌疑人,同时如果XX的确是可能的嫌疑人,那么这个人说的话是不确定的,否则就是假话。如果某个人说一个人XX不是嫌疑人,同时如果XX在可能的嫌疑人中,那么这个人说的话也是不确定的,否则就是真话。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include<stdio.h> #include<string.h> #include<algorithm> #include<iostream> #include<vector> using namespace std; const int maxn = 101000; int isprison[maxn], noprison[maxn]; int possible[maxn]; int a[maxn]; int main(){ int T,n,m; scanf ( "%d" ,&T); while (T--){ memset (isprison,0, sizeof (isprison)); memset (noprison,0, sizeof (noprison)); memset (possible,0, sizeof (possible)); scanf ( "%d%d" ,&n,&m); int issum = 0, nosum = 0; for ( int i = 1; i <= n; i++){ scanf ( "%d" ,&a[i]); if (a[i]>0){ isprison[a[i]]++; issum++; } else { noprison[-a[i]]++; nosum++; } } int k = 0; for ( int i = 1; i <= n; i++){ if (m == nosum - noprison[i] + isprison[i]){ possible[i] = 1; k++; } } if (k > 1){ for ( int i = 1; i <= n; i++){ if (a[i] > 0){ if (possible[a[i]]){ puts ( "Not defined" ); } else { puts ( "Lie" ); } } else { if (possible[-a[i]]){ puts ( "Not defined" ); } else { puts ( "Truth" ); } } } } else { for ( int i = 1; i <= n; i++){ if (a[i] > 0){ if (possible[a[i]]){ puts ( "Truth" ); } else { puts ( "Lie" ); } } else { if (possible[-a[i]]){ puts ( "Lie" ); } else { puts ( "Truth" ); } } } } } return 0; } /* 55 4 1 +2 -3 +4 -1 */ |
学学学 练练练 刷刷刷
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步