PAT甲级1148Werewolf - Simple Version
题目链接
https://pintia.cn/problem-sets/994805342720868352/problems/1038429808099098624
题解
题目要求
N(5到100)个玩家,其中2个狼人,只有1个狼人在撒谎(题目里说至少有1个狼人在撒谎但不是所有狼人都在撒谎……直接讲只有1个狼人在撒谎不行吗……),共有2人撒谎,请找出两个狼人
描述中+则是人类,-则是狼人
如果有解,请按增序输出狼人
如果多个解,则输出最小的
没有讲解则输出"No Solution"
思路
刚看完题时没啥思路……特别是有多个解的情况,让我以为要求出所有解,我似乎还想过枚举是谁在撒谎(得到谁在撒谎并不能很有效地得到答案……)
可以枚举狼人是谁的情况,如果与题目和输入相符(1个狼人和1个人在撒谎),则直接输出狼人(如果有多个解,从小到大枚举狼人求得的第一个解就是多个解中最小的解)
// Problem: PAT Advanced 1148
// URL: https://pintia.cn/problem-sets/994805342720868352/problems/1038429808099098624
// Tags: Math
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main()
{
// 获取输入
int n;
cin >> n;
vector<int> statements(n+1);
for (int i = 1; i <= n; i++)
cin >> statements[i];
for (int i = 1; i < n; i++){
for(int j = i+1; j <= n; j++){
// 枚举2个狼人是i和j
vector<int> identities(n+1, 1); // 玩家身份:1代表人类,-1代表狼人
identities[i] = identities[j] = -1; // i和j是狼人
// 寻找撒谎的玩家
vector<int> liars;
for (int k = 1; k < statements.size(); k++){
if (statements[k] * identities[abs(statements[k])] < 0)
liars.push_back(k);
}
// 判断当前枚举的狼人i和j是否符合题目要求和输入
if (liars.size() == 2 && identities[liars[0]] + identities[liars[1]] == 0){
cout << i << " " << j;
return 0;
}
}
}
cout << "No Solution";
return 0;
}
作者:@臭咸鱼
转载请注明出处:https://www.cnblogs.com/chouxianyu/
欢迎讨论和交流!