P1199 [NOIP2010 普及组] 三国游戏 Python

题目地址:P1199 [NOIP2010 普及组] 三国游戏

       

        本题代码量小,但思路比较难想, 在本题中,小涵是一定能赢的(不信你就print(0)试试,结果是一分没得啊QwQ),案例给出的输入与所给出的表相比很难理解,所以我们先把输入列表改为题目所给出表的形式,因为涉及数列越界问题,所以我们采用倒序输入:

n = int(input())
general = [[0] * n for _ in range(n)]
arr = [list(map(int, input().split())) for _ in range(n - 1)]
ans = 0

for i in range(n - 1):
    for j in range(-1, -len(arr[i]) - 1, -1):
        general[i][j] = arr[i][j]
        general[j][i] = general[i][j]

       若我们只取最大默契度,计算机永远不会让我们拿到最大默契值那一组,但计算机并不聪明,他只会拆我们的最大组合,所以当我们去拿倒数第二大的武将时,计算机自然而然的就回去拿第一大的,但是只有数值第一大的武将跟数值第二大武将在一起才能发挥数值第一武将的数值(比如我拿走了武将5,相应的计算机会拿走武将4,因为4-5默契值是33,但是下一步我们会拿走3,会组成5-3默契值为32,而计算机要组成比32还要大的值就必须拿走5,而5我们已经拿走了),这样每个默契值的最大值已经被拆散,我们要去拿默契值次大的,所以我们只需要找默契值次大中的最大值就行。

找出次大值中的最大值:

for i in range(n):
    general[i].sort()  # 对数值排序不影响计算机的选择
    if general[i][-2] > ans:
        ans = general[i][-2]

完整代码:

n = int(input())
general = [[0] * n for _ in range(n)]
arr = [list(map(int, input().split())) for _ in range(n - 1)]
ans = 0

for i in range(n - 1):
    for j in range(-1, -len(arr[i]) - 1, -1):
        general[i][j] = arr[i][j]
        general[j][i] = general[i][j]

for i in range(n):
    general[i].sort()  # 对数值排序不影响计算机的选择
    if general[i][-2] > ans:
        ans = general[i][-2]

print(1)
print(ans)

   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值