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\n");
else printf("Truth\n");
}
else printf("Lie\n");
}
else {
t=-t;
if(crimer[t]){
if(cnt>1)printf("Not defined\n");
else printf("Lie\n");
}
else printf("Truth\n");
}
}
}
Wrong Answer Cases
What I Learn
针对不确定情况,在这里是Not defined
,采取的策略是获取所有的可能的结果。