zoukankan      html  css  js  c++  java
  • FZU 2202——犯罪嫌疑人——————【思维题】

    犯罪嫌疑人
    Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u

    Description

    福尔摩斯是个大侦探,他总是在解决疑难案件。这一次的案件也不例外,案件是这样的:有编号为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个,我们可以首先统计出来可能的嫌疑人有多少个,标记出来。1.当可能的嫌疑人只有1个,那么某人说嫌疑人是他的时候,话是真的,否则是假的。某人说其他人是嫌疑人的时候,话是假的,否则是真的。2.当可能的嫌疑人有多个的时候,然后枚举每个人说的话。如果某个人说一个人XX是嫌疑人,同时如果XX的确是可能的嫌疑人,那么这个人说的话是不确定的,否则就是假话。如果某个人说一个人XX不是嫌疑人,同时如果XX在可能的嫌疑人中,那么这个人说的话也是不确定的,否则就是真话。
     
     
    #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
    */
    

      

  • 相关阅读:
    hdu 1017 A Mathematical Curiosity 解题报告
    hdu 2069 Coin Change 解题报告
    hut 1574 组合问题 解题报告
    hdu 2111 Saving HDU 解题报
    hut 1054 Jesse's Code 解题报告
    hdu1131 Count the Trees解题报告
    hdu 2159 FATE 解题报告
    hdu 1879 继续畅通工程 解题报告
    oracle的系统和对象权限
    oracle 自定义函数 返回一个表类型
  • 原文地址:https://www.cnblogs.com/chengsheng/p/4947126.html
Copyright © 2011-2022 走看看