犯罪嫌疑人 FZU - 2202

http://acm.fzu.edu.cn/problem.php?pid=2202

记录下正负数各有多少 再用book[i]代表说i是或不是罪犯的个数

枚举罪犯 如果当i为罪犯时 book1[i]+cnt2-book2[i]即为说真话的人数 如果该值等于m 则i有可能是罪犯 否则绝对是清白的

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=1e5+10;

int ary[maxn],book1[maxn],book2[maxn],flag[maxn];
int n,m,cnt1,cnt2;

int main()
{
    int t,i,sum;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        memset(book1,0,sizeof(book1));
        memset(book2,0,sizeof(book2));
        cnt1=0,cnt2=0;
        for(i=1;i<=n;i++){
            scanf("%d",&ary[i]);
            if(ary[i]>0){
                book1[ary[i]]++;
                cnt1++;
            }
            else{
                book2[-ary[i]]++;
                cnt2++;
            }
        }
        memset(flag,0,sizeof(flag));
        sum=0;
        for(i=1;i<=n;i++){
            if(book1[i]+cnt2-book2[i]==m){
                flag[i]=1;
                sum++;
            }
        }
        for(i=1;i<=n;i++){
            if(ary[i]>0){
                if(flag[ary[i]]){
                    if(sum>1) printf("Not defined\n");
                    else printf("Truth\n");
                }
                else printf("Lie\n");
            }
            else{
                if(flag[-ary[i]]){
                    if(sum>1) printf("Not defined\n");
                    else printf("Truth\n");
                }
                else{
                    printf("Truth\n");
                }
            }
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/88987198