爆刷PAT(甲级)——之【1148】 Werewolf - Simple Version(20 分)——思维
之前考的时候想不到。今日抽空解决一下。
题意: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 分)——思维相关推荐
- 【PAT甲级题解记录】1148 Werewolf - Simple Version (20 分)
[PAT甲级题解记录]1148 Werewolf - Simple Version (20 分) 前言 Problem:1148 Werewolf - Simple Version (20 分) Ta ...
- PAT甲级 -- 1148 Werewolf - Simple Version (20 分)
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- 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 ...
- 【PTA Advanced】1148 Werewolf - Simple Version(C++)
目录 题目 Input Specification: Output Specification: Sample Input 1: Sample Output 1: Sample Input 2: Sa ...
- PAT 1148 Werewolf – Simple Version – 甲级
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- 1148 Werewolf - Simple Version 甲级
题意: 有n个玩家,有两个狼人,有两人说慌(其中一个为狼人一个为非狼人),找出狼人是谁? 题解: 暴力枚举 先枚举i和j为狼人,然后从1号开始假设其说谎,然后判断是否符合题目要求 代码: #inclu ...
- 1148 Werewolf - Simple Version (20 分)
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- 1148 Werewolf - Simple Version
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- PAT (顶级) 升级版 7-1 Werewolf harder version(15分)
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- 【PAT甲级 排序】1096 Consecutive Factors (20 分) C++ 全部AC
题目 难倒是不难,暴力破解即可.要注意的就是开longlong,以及开方时,不要丢失临界值,还有如果子序列长度为0的话,输出num本身(因为计算的时候不考虑1这个因数). 一开始想出来一种O(n)的算 ...
最新文章
- DB-MySQL:MySQL 事务
- Linux基础之shell变量
- 使用pyinstaller打包python_使用pyinstaller打包Python项目,python
- 元宇宙iwemeta:赵长鹏指出,监管不懂区块链,币安是区块链技术
- 响应式微服务 in java 译 十五 Microservices in OpenShift
- Java web 开发的概念、环境配置、创建项目过程详解(Eclipse)
- 【GDOI2014模拟】旅行 题解代码
- python画图中grid等于true_Python3.0科学计算学习之绘图(二)
- 【Selenium-WebDriver自学】Selenium测试设计技术(十三)
- 使用Spring Data REST将Spring Data JPA存储库导出为REST服务
- 快速入门系列之 Scala 语言 GitChat连接
- js字符串转换为json对象JSON.parse()及将json对象转为json字符串JSON.stringify()
- CSS3学习笔记之loading动画
- ubuntu中make出错
- 情感分析入门[2]-一些数学工具
- 苹果 服务通知 V2
- python问题——ValueError: only 2 non-keyword arguments accepted
- (真实经验)我干了5年的JAVA面试官,发现很多求职者都忽略这七大方面的问题!
- python使用selenium爬取dell官网驱动(一):获取遍历各驱动的下载网址
- 安霸Ambarella_海思Hisilicon_AI芯片参数对比