之前考的时候想不到。今日抽空解决一下。

题意:N个人各指认一个人是好人还是坏人。其中有两个坏人,剩下的都是好人。而且必然是一个好人和一个坏人说的是谎话。给出他们互相指认的信息,请判断出哪两个是坏人。如果由多种答案,输出最小标号的组合。

难点:当初看到数据量N小于等于200,就知道使用暴力。但是没想到怎么去暴力。

当时吧以为人物之间的指认关系是像一张拓扑图一样,所以某个人说的如果是谎话的话后面的节点(后续的指认)都会反过来,就理所当然的以为是搜索的题目了。但这样子加入暴力枚举那两个人是狼,就没想好怎么去寻找拓扑图的开始节点。

昨天重拾,发现自己想多了。这个题目并不是一个拓扑图。因为如果A说B是好人,B说C是好人。如果A是说了谎,并不会改变B说的话的确信度。我自己坑了我自己,想复杂了。

这个题目中设定了好人和坏人;撒谎的人和没有撒谎的人。这两个概念是独立的,不要混在一起,是考验逻辑呀。

所以解决方案是,枚举两个人是坏人,如此一来坏人的身份已经全部确定,接下来如果有哪个人A说某个人B是坏人,而这个被告B并不是我们枚举的坏人,那么这个A就是在扯淡,就是说谎的人!如果哪个人A说某个人B是好人,但是这个人B分明就是我们已经假定的坏人,那这个A又在扯淡,也是说谎的人!

如此以来,每次枚举两个坏人的情况下,我们可以分别确定出在这种情形下撒谎的人的个数。

题目说,撒谎的只有两人,而且一人是好人一人是坏人。所以我们分别统计各好人和坏人撒谎的人数是否都为1,若是即为答案。

Code:

#include<bits/stdc++.h>
using namespace std;
#define inf 209
#define INF 0x3f3f3f3fint man[inf];//输入指控
int judge(int v,int wolf1,int wolf2)//返回1则在说谎
{int u=man[v];int pos=abs(u);if(u<0&&pos!=wolf1&&pos!=wolf2)return 1;//说别人坏人但是对方是好人if(u>0&&(pos==wolf1||pos==wolf2))return 1;//说对方好人但对方是坏人return 0;
}
int main()
{int i,j,k;int n;int sum1,sum2;//说谎者:狼-人cin>>n;for(i=1;i<=n;i++)cin>>man[i];for(i=1;i<n;i++)//狼1for(j=i+1;j<=n;j++)//狼2{sum1=sum2=0;for(k=1;k<=n;k++){sum1+=judge(k,i,j)&&(k==i||k==j);//狼说谎sum2+=judge(k,i,j)&&k!=i&&k!=j;//村民说谎}if(sum1==1&&sum2==1){printf("%d %d\n",min(i,j),max(i,j));return 0;}}printf("No Solution\n");return 0;
}

爆刷PAT(甲级)——之【1148】 Werewolf - Simple Version(20 分)——思维相关推荐

  1. 【PAT甲级题解记录】1148 Werewolf - Simple Version (20 分)

    [PAT甲级题解记录]1148 Werewolf - Simple Version (20 分) 前言 Problem:1148 Werewolf - Simple Version (20 分) Ta ...

  2. PAT甲级 -- 1148 Werewolf - Simple Version (20 分)

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  3. PAT(甲级)2018年秋季考试 7-1 Werewolf - Simple Version (20 分)

    7-1 Werewolf - Simple Version (20 分) Werewolf(狼人杀) is a game in which the players are partitioned in ...

  4. 【PTA Advanced】1148 Werewolf - Simple Version(C++)

    目录 题目 Input Specification: Output Specification: Sample Input 1: Sample Output 1: Sample Input 2: Sa ...

  5. PAT 1148 Werewolf – Simple Version – 甲级

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  6. 1148 Werewolf - Simple Version 甲级

    题意: 有n个玩家,有两个狼人,有两人说慌(其中一个为狼人一个为非狼人),找出狼人是谁? 题解: 暴力枚举 先枚举i和j为狼人,然后从1号开始假设其说谎,然后判断是否符合题目要求 代码: #inclu ...

  7. 1148 Werewolf - Simple Version (20 分)

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  8. 1148 Werewolf - Simple Version

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  9. PAT (顶级) 升级版 7-1 Werewolf harder version(15分)

    Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...

  10. 【PAT甲级 排序】1096 Consecutive Factors (20 分) C++ 全部AC

    题目 难倒是不难,暴力破解即可.要注意的就是开longlong,以及开方时,不要丢失临界值,还有如果子序列长度为0的话,输出num本身(因为计算的时候不考虑1这个因数). 一开始想出来一种O(n)的算 ...

最新文章

  1. DB-MySQL:MySQL 事务
  2. Linux基础之shell变量
  3. 使用pyinstaller打包python_使用pyinstaller打包Python项目,python
  4. 元宇宙iwemeta:赵长鹏指出,监管不懂区块链,币安是区块链技术
  5. 响应式微服务 in java 译 十五 Microservices in OpenShift
  6. Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
  7. 【GDOI2014模拟】旅行 题解代码
  8. python画图中grid等于true_Python3.0科学计算学习之绘图(二)
  9. 【Selenium-WebDriver自学】Selenium测试设计技术(十三)
  10. 使用Spring Data REST将Spring Data JPA存储库导出为REST服务
  11. 快速入门系列之 Scala 语言 GitChat连接
  12. js字符串转换为json对象JSON.parse()及将json对象转为json字符串JSON.stringify()
  13. CSS3学习笔记之loading动画
  14. ubuntu中make出错
  15. 情感分析入门[2]-一些数学工具
  16. 苹果 服务通知 V2
  17. python问题——ValueError: only 2 non-keyword arguments accepted
  18. (真实经验)我干了5年的JAVA面试官,发现很多求职者都忽略这七大方面的问题!
  19. python使用selenium爬取dell官网驱动(一):获取遍历各驱动的下载网址
  20. 安霸Ambarella_海思Hisilicon_AI芯片参数对比

热门文章

  1. Android屏幕监视方法,Android 关于手机屏幕的那些事
  2. jquery+easyui培训文档
  3. win10打印机无法删除怎么办
  4. Discuz论坛 创始人密码忘记解决办法!
  5. 结构静力分析与动力学分析_51CAE_新浪博客
  6. CSDN个人博客管理
  7. 运维部奖励员工之大连游记
  8. 耀华仪表A9数据解析(C#)
  9. SOC低功耗电路设计方法
  10. 艾美捷双链RNA定量试剂盒试验方案