1148 Werewolf - Simple Version
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 (5). Then N lines follow and the i-th line gives the statement of the i-th player (1), 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 [ and [, if there exists 0 such that [ (i≤k) and [, 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
题意:
有N个人,这里面有两只是狼人,一只狼人说真话,另一只狼人说假话,另外还有一个人类说假话,判断那两个人是狼人。
思路:
看大佬写的吧~
Code:
- #include<iostream>
- #include<vector>
- #include<cmath>
- #include<set>
- #include<algorithm>
- using namespace std;
- bool cmp(pair<int, int> a, pair<int, int> b) {
- if (a.first == b.first) {
- return a.second < b.second;
- } else {
- return a.first < b.first;
- }
- }
- int main() {
- int n, t;
- cin >> n;
- set<int> human;
- set<int> werewolf;
- vector<int> said(n+1, 0);
- vector<pair<int, int> > twoWereWolf;
- for (int i = 1; i <= n; ++i) {
- cin >> t;
- said[i] = t;
- }
- bool wrong = false;
- int werewolf1, werewolf2;
- bool foundWerewolf1 = false;
- bool foundWerewolf2 = false;
- for (int i = 1; i <= n; ++i) {
- for (int j = 1; j <= n; ++j) {
- if (j == i) continue;
- werewolf1 = -1;
- werewolf2 = -1;
- wrong = false;
- foundWerewolf1 = false;
- foundWerewolf2 = false;
- human.clear();
- werewolf.clear();
- for (int k = 1; k <= n; ++k) {
- if (k != i && k != j) {
- if (said[k] < 0)
- werewolf.insert(abs(said[k]));
- else
- human.insert(said[k]);
- }
- }
- for (int h : human) {
- if (h == i) {
- werewolf1 = j;
- foundWerewolf1 = true;
- }
- if (h == j) {
- werewolf1 = i;
- foundWerewolf1 = true;
- }
- }
- for (int w : werewolf) {
- if (w != werewolf1) {
- werewolf2 = w;
- foundWerewolf2 = true;
- }
- }
- if (foundWerewolf1 && foundWerewolf2) {
- if (human.find(foundWerewolf1) == human.end() && human.find(foundWerewolf2) == human.end())
- if (werewolf.find(werewolf1) != werewolf.end() || werewolf.find(werewolf2) != werewolf.end())
- twoWereWolf.push_back({werewolf1, werewolf2});
- }
- }
- }
- sort(twoWereWolf.begin(), twoWereWolf.end(), cmp);
- if (twoWereWolf.size() > 0) {
- cout << twoWereWolf[0].first << " " << twoWereWolf[0].second << endl;
- } else {
- cout << "No Solution" << endl;
- }
- return 0;
- }
记得上上次考试的时候我没有做出来这道题,今天又做了一下,只通过了两组样例。
大佬的代码:https://www.liuchuo.net/archives/6494
- #include <iostream>
- #include <vector>
- #include <cmath>
- using namespace std;
- int main() {
- int n;
- cin >> n;
- vector<int> 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<int> lie, a(n + 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);
- if (lie.size() == 2 && a[lie[0]] + a[lie[1]] == 0) {
- cout << i << " " << j;
- return 0;
- }
- }
- }
- cout << "No Solution";
- return 0;
- }
1148 Werewolf - Simple Version的更多相关文章
- PAT 1148 Werewolf - Simple Version
1148 Werewolf - Simple Version (20 分) Werewolf(狼人杀) is a game in which the players are partitioned ...
- PAT 1148 Werewolf - Simple Version [难理解]
1148 Werewolf - Simple Version (20 分) Werewolf(狼人杀) is a game in which the players are partitioned i ...
- PAT(A) 1148 Werewolf - Simple Version(Java)逻辑推理
题目链接:1148 Werewolf - Simple Version (20 point(s)) Description Werewolf(狼人杀) is a game in which the p ...
- 1148 Werewolf - Simple Version (20 分)
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- PAT_A1148#Werewolf - Simple Version
Source: PAT 1148 Werewolf - Simple Version (20 分) Description: Werewolf(狼人杀) is a game in which the ...
- PAT A1148 Werewolf - Simple Version (20 分)——暴力遍历,负负得正
Werewolf(狼人杀) is a game in which the players are partitioned into two parties: the werewolves and th ...
- [Functional Programming] Write a simple version of Maybe
Maybe has two types: Just / Nothing. Just() will just return the value that passed in. Nothing retur ...
- PAT 2018 秋
A 1148 Werewolf - Simple Version 思路比较直接:模拟就行.因为需要序列号最小的两个狼人,所以以狼人为因变量进行模拟. #include <cstdio> # ...
- 2018.9.8pat秋季甲级考试
第一次参加pat考试,结果很惨,只做了中间两道题,还有一个测试点错误,所以最终只得了不到50分.题目是甲级练习题的1148-1151. 考试时有些紧张,第一题第二题开始测试样例都运行不正确,但是调试程 ...
随机推荐
- Kubernetes-6.Service
docker version:20.10.2 kubernetes version:1.20.1 本文概述Kubernetes Service的基本原理和使用. 服务 Service是将运行在一组Po ...
- 腾讯一面问我SQL语句中where条件为什么写上1=1
目录 where后面加"1=1″还是不加 不用where 1=1 在多条件查询的困惑 使用where 1=1 的好处 使用where 1=1 的坏处 where后面加"1=1″还是 ...
- JS table排序
<html lang="en"> <head> <meta charset="UTF-8"> <meta http-e ...
- Fastjson1.2.24RCE漏洞复现
Fastjson1.2.24RCE漏洞复现 环境搭建 这里用的Vulhub靶场 cd /vulhub/fastjson/1.2.24-rce docker-compose up -d 报错 ERROR ...
- 爬虫必知必会(4)_异步协程-selenium_模拟登陆
一.单线程+多任务异步协程(推荐) 协程:对象.可以把协程当做是一个特殊的函数.如果一个函数的定义被async关键字所修饰.该特殊的函数被调用后函数内部的程序语句不会被立即执行,而是会返回一个协程对象 ...
- url里bookmark是什么意思
<a rel="bookmark" href="abc.com"> 点击查看 </a> rel 这个属性的全称是 relationsh ...
- [SNOI2019] 通信
一.题目 点此看题 二.解法 一看就是傻逼补流模型,不会真的有人这个图都建不出来吧 别走啊,我不阴阳怪气了,如果你不知道怎么建这里有图嘛(思路来源是餐巾计划问题): 其中标红的边数量级很大,因为 \( ...
- UI透明欺诈
判断是否存在的代码: private static boolean c(Activity paramActivity) { List localList = ((ActivityMan ...
- 关于python浮点数精度问题计算误差的原因分析
在python中使用浮点数运算可能会出现如下问题 a = 0.1+0.2print(a) 输出的结果是 0.30000000000000004 原因如下: 出现上面的情况,主要还是因浮点数在计算机中实 ...
- LuckyStar hctf2018
LuckyStar hctf2018 程序注册有TLS回调函数 char __stdcall TlsCallback_0(int a1, int a2, int a3) { char result; ...