题目地址: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)