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/

欢迎讨论和交流!


posted @ 2020-08-05 23:21  臭咸鱼  阅读(128)  评论(0编辑  收藏  举报