用python来解 PAT乙级1089 狼人杀-简单版 -20-满分无超时(带注释)

题意概括,在第i行用正负号+j的形式顺序输入,表示i号对j号的发言,+是好人,-是狼人,输出最小的解告诉大家狼人是哪两个,撒谎的人是一个好人和一个狼人一共两个人,无解输出‘No Solution’

所以本题思路可以先假设两只狼,然后看所有人的逻辑是否都行得通,因为多解时是输出最小的解,所以可以直接遍历假设狼的号码,遇到正确解就直接中断并输出

代码如下(有注释):

n = int(input())
s = [int(input()) for i in range(n)]  # 将他们说的话放在一个列表里

for i in range(1,n):#假设第一只狼
    for j in range(i+1, n+1):#假设第二只狼
        good_peo = 0#定义说谎的好人变量
        wolves = 0#定义说谎的狼人变量
        for k in range(1,n+1):
            #如果有人说i或者j是好人,或者说i和j之外的人是狼人,那么这个人说谎了
            if (s[k-1] > 0 and (s[k-1] == i or s[k-1] == j)) or (s[k-1] < 0 and abs(s[k-1]) != i and abs(s[k-1]) != j):
                if k == i or k == j:#对照看这个说谎的人是不是狼人,是的话说谎的狼人+1
                    wolves += 1

                else:#看这个说谎的人是不是好人,是的话说谎的好人+1
                    good_peo += 1
        if wolves == 1 and good_peo == 1:#如果说谎的人包括一个好人和一个狼人
            print(i, j)#答案正确,直接输出
            exit()
print('No Solution')#遍历结束没有正确答案,输出‘No Solution’

提交结果:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值