博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PAT 1148 Werewolf - Simple Version [难理解]
阅读量:5132 次
发布时间:2019-06-13

本文共 3084 字,大约阅读时间需要 10 分钟。

1148 Werewolf - Simple Version (20 分)

Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and the human beings. Suppose that in a game,

  • player #1 said: "Player #2 is a werewolf.";
  • player #2 said: "Player #3 is a human.";
  • player #3 said: "Player #4 is a werewolf.";
  • player #4 said: "Player #5 is a human."; and
  • player #5 said: "Player #4 is a human.".

Given that there were 2 werewolves among them, at least one but not all the werewolves were lying, and there were exactly 2 liars. Can you point out the werewolves?

Now you are asked to solve a harder version of this problem: given that there were N players, with 2 werewolves among them, at least one but not all the werewolves were lying, and there were exactly 2 liars. You are supposed to point out the werewolves.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (5N100). Then N lines follow and the i-th line gives the statement of the i-th player (1iN), which is represented by the index of the player with a positive sign for a human and a negative sign for a werewolf.

Output Specification:

If a solution exists, print in a line in ascending order the indices of the two werewolves. The numbers must be separated by exactly one space with no extra spaces at the beginning or the end of the line. If there are more than one solution, you must output the smallest solution sequence -- that is, for two sequences A=a[1],...,a[M] and B=b[1],...,b[M], if there exists 0k<M such that a[i]=b[i] (ik) and a[k+1]<b[k+1], then A is said to be smaller than B. In case there is no solution, simply print No Solution.

Sample Input 1:

5-2+3-4+5+4

Sample Output 1:

1 4

Sample Input 2:

6+6+3+1-5-2+4

Sample Output 2 (the solution is not unique):

1 5

Sample Input 3:

5-2-3-4-5-1

Sample Output 3:

No Solution

 题目大意:狼人杀里有狼人和村民,假设在一群人中一共有两个狼人,并且至少有一个狼人但并不是所有的狼人都说慌,而且恰好有两个说谎的人,那么你需要找出狼人。如果解不唯一,输出序号小的一组。

//当时考试的时候看着道题目,完全不理解,看了20分钟就放弃了,也是通过率最低的一道题目

//看柳神的题解,说是水题,我奔溃了。

代码来自:https://www.liuchuo.net/archives/6494 

 

#include 
#include
#include
using namespace std;int main() { int n; cin >> n; vector
v(n+1); for (int i = 1; i <= n; i++) cin >> v[i]; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { vector
lie, a(n + 1, 1);//都赋值为1. a[i] = a[j] = -1;//如果这两者是狼人。 for (int k = 1; k <= n; k++) if (v[k] * a[abs(v[k])] < 0) lie.push_back(k); //<0,则表示K在说谎。 if (lie.size() == 2 && a[lie[0]] + a[lie[1]] == 0) { cout << i << " " << j;//两者都不是狼人。 return 0;//直接返回,就是最小的标号 } } } cout << "No Solution"; return 0;}

 

//这个判断<0,简直不要太厉害了。

1.v[i]表示i说v[i]是什么;

2.使用符号来判断是否说谎;

3.a[abs(v[k])]的符号用来判断当前假定条件下(a[i]和a[j]是狼人),v[k]是当前第k个人说v[k]是村民还是狼人,符号来表示,如果两者不一致,那么在此种假设下,就是说谎;

4.对于说谎的,如果长度正好为2,并且一个是狼人一个是村民,也就是二者的和为0,正负抵消。

转载于:https://www.cnblogs.com/BlueBlueSea/p/9683292.html

你可能感兴趣的文章
Centos 7.0 安装Mono 3.4 和 Jexus 5.6
查看>>
Windows 7 上安装Visual Studio 2015 失败解决方案
查看>>
iOS按钮长按
查看>>
Shell流程控制
查看>>
CSS属性值currentColor
查看>>
[Leetcode|SQL] Combine Two Tables
查看>>
《DSP using MATLAB》Problem 7.37
查看>>
ROS lesson 1
查看>>
js笔记
查看>>
c风格字符串函数
查看>>
python基础学习第二天
查看>>
java可重入锁reentrantlock
查看>>
浅谈卷积神经网络及matlab实现
查看>>
struts2学习(9)struts标签2(界面标签、其他标签)
查看>>
Android 导入jar包 so模块--导入放置的目录
查看>>
解决ajax请求cors跨域问题
查看>>
Android Studio
查看>>
zz 圣诞丨太阁所有的免费算法视频资料整理
查看>>
【大数模板】C++大数类 大数模板
查看>>
【123】
查看>>