1089 狼人杀-简单版 逻辑题

题解

逻辑题
我一开始的想法是狼人中一定有一个人是说谎的,而且还有另一个不是狼人的人在说谎,于是把说谎的人的可能性,遍历出来。可是这样很麻烦,最后也才是8分,我看到别的代码短的,就没有再去改bug了
正确的思路:
依次遍历每一对人,这一对人是狼人,然后判断有几个说谎的人,如果说谎的人数是2,并且一个是狼人一个不是狼人,就输出
判断是否说谎也比较容易
加入我们已知谁是狼人谁不是
然后和原数据结果不一样的,就是说谎的人

Code

#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++)
        {
            // t存储全员的属性
            vector<int> lie, t(N + 1, 1);
            t[i] = t[j] = -1;
            // 依次检查每个人
            for (int p = 1; p <= N; p++)
            {
                // v[p]:p说 abs(v[p]) 的属性
                // 看是不是和p说的一样
                int index = abs(v[p]);
                if (t[index] * v[p] < 0)
                    lie.push_back(p);
            }
            if (lie.size() == 2 && t[lie[0]] + t[lie[1]] == 0)
            {
                cout << i << " " << j;
                return 0;
            }
        }
    }
    cout << "No Solution";
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值