我是靠谱客的博主 高挑导师,这篇文章主要介绍Suspects,现在分享给大家,希望可以做个参考。

原题:CodeForces - 156B

题意:

一个人犯罪,n个人m个说了真话,+n:n是罪犯,-n:n不是
判断每个人说的话的真假

解析

枚举每个人是罪犯的情况

有以下要求才能实现:

  1. 判断i为罪犯时怎么求说真话人数
    用d数组存说i为罪犯的人数,nd存说i不是的人数,sum_no存所有说不是的人数,那么真话人数==d[i]+(sum-nd[i])
  2. 判断每个人说的话
    存下每个人说的话,假设只有一种情况真话人数==m,那么看看i说的和那种情况符合与否;如果有多种情况,假设对所有情况都不符合或都符合即可判断真假,若有符合有不符合的就为不确定

代码

复制代码
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
#include<stdio.h> #include<iostream> #include<vector> using namespace std; int n,m; int say[100009],d[100009],nd[100009],is_cri[100009]; int main(){ scanf("%d%d",&n,&m); int sum_no=0,sum_cri=0; for(int i=1;i<=n;i++){ scanf("%d",&say[i]); if(say[i]>0)d[say[i]]++; else { nd[-say[i]]++;sum_no++; } } for(int i=1;i<=n;i++){ if(d[i]+sum_no-nd[i]==m)is_cri[i]=1,sum_cri++; } for(int i=1;i<=n;i++){ if(say[i]>0){ if(sum_cri==1&&is_cri[say[i]]==1)printf("Truthn"); else if(is_cri[say[i]]==0)printf("Lien");//说是的那个人不可能为罪犯 else printf("Not definedn");//除了说的那个还有其他人可能是罪犯 } else{ if(is_cri[-say[i]]==0)printf("Truthn");//说的那个不可能是 else if(sum_cri==1)printf("Lien");//肯定是说的那个 else printf("Not definedn"); } } }

最后

以上就是高挑导师最近收集整理的关于Suspects的全部内容,更多相关Suspects内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部