Codeforces Tutorial
B. Suspects
Problem Analysis
小时候最怕这种推理题了(笑哭)
用(accuse_i)表示认为第(i)个人是罪犯的人数
用(defend_i)表示认为第(i)个人不是罪犯的人数
用(neg)表示认为某个人不是罪犯的人数
[accuse_i=sum_{k=1}^{n}a_k==+i
]
[defend_i=sum_{k=1}^{n}a_k==-i
]
[neg=sum_{k=1}^{n}a_k lt 0
]
假设(i)是罪犯,(honest)表示说实话的人,那么:
[honest=accuse_i+neg-defend_i
]
Acepted Code
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<map>
#include<istream>
#include<cassert>
#include<set>
#define DEBUG(x) cout<<#x<<" = "<<x<<endl
#define DEBUG2(x,y) cout<<#x<<" = "<<x<<" , "
<<#y<<" = "<<y<<endl
using namespace std;
typedef long long ll;
const int MAXN=1e5+10;
int n,m;
int neg=0;
int a[MAXN];
int accuse[MAXN];
int defend[MAXN];
int crimer[MAXN];
int cnt=0;
int main()
{
// freopen("in.txt","r",stdin);
scanf("%d%d",&n,&m);
for(int ii=1;ii<=n ;ii++ ){
int t;
scanf("%d",&t);
a[ii]=t;
if(t>0)accuse[t]++;
else defend[-t]++,neg++;
}
for(int ii=1;ii<=n ;ii++ ){
int honest=accuse[ii]+neg-defend[ii];
if(honest==m){
crimer[ii]=1;
cnt++;
}
}
for(int ii=1;ii<=n ;ii++ ){
int t=a[ii];
if(t>0){
if(crimer[t]){
if(cnt>1)printf("Not defined
");
else printf("Truth
");
}
else printf("Lie
");
}
else {
t=-t;
if(crimer[t]){
if(cnt>1)printf("Not defined
");
else printf("Lie
");
}
else printf("Truth
");
}
}
}
Wrong Answer Cases
What I Learn
针对不确定情况,在这里是Not defined
,采取的策略是获取所有的可能的结果。