Python每日一题(11)
Python每日一题2025.3.31
- 一、题目
- 题目描述
- 输入格式
- 输出格式
- 输入输出样例 #1
- 输入 #1
- 输出 #1
- 二、分析
- 三、源代码
- 四、deepseek解决
一、题目
题目描述
有 2 n 2^n 2n( n ≤ 7 n\le7 n≤7)个国家参加世界杯决赛圈且进入淘汰赛环节。已经知道各个国家的能力值,且都不相等。能力值高的国家和能力值低的国家踢比赛时高者获胜。1 号国家和 2 号国家踢一场比赛,胜者晋级。3 号国家和 4 号国家也踢一场,胜者晋级……晋级后的国家用相同的方法继续完成赛程,直到决出冠军。给出各个国家的能力值,请问亚军是哪个国家?
输入格式
第一行一个整数 n n n,表示一共 2 n 2^n 2n 个国家参赛。
第二行 2 n 2^n 2n 个整数,第 i i i 个整数表示编号为 i i i 的国家的能力值( 1 ≤ i ≤ 2 n 1\leq i \leq 2^n 1≤i≤2n)。
数据保证不存在平局。
输出格式
仅一个整数,表示亚军国家的编号。
输入输出样例 #1
输入 #1
3
4 2 3 1 10 5 9 7
输出 #1
1
二、分析
首先需要判断最大的数在哪侧,然后另一侧一定是亚军所在位置。之后我们返回亚军所在位置下标就可以了。
三、源代码
n=int(input())
l=list(map(int, input().split()))
maxc=max(l)
i=l.index(maxc)
mid=2**n//2#这里最好是整除,要不下面切片的话会存在问题
if i<mid:
right_half=l[mid:]
right_max=max(right_half)
max_index=mid+right_half.index(right_max)
else:
# 冠军在右半区,亚军在左半区
left_half=l[:mid]
left_max=max(left_half)
max_index=left_half.index(left_max)
print(max_index+1)
四、deepseek解决
典型的二叉树问题,感觉用二叉树能做,所以给deepseek添加了条件,用二叉树解决。最后也是测试样例都通过了,没有问题。
class Node:
def __init__(self, val, country, left=None, right=None):
self.val = val
self.country = country
self.left = left
self.right = right
n = int(input())
countries = list(map(int, input().split()))
# 创建叶子节点
nodes = [Node(val, i + 1) for i, val in enumerate(countries)]
queue = nodes.copy()
# 自底向上构建二叉树
while len(queue) > 1:
next_queue = []
# 每次处理两个节点,生成父节点
for i in range(0, len(queue), 2):
left = queue[i]
right = queue[i + 1]
if left.val > right.val:
parent_val = left.val
parent_country = left.country
else:
parent_val = right.val
parent_country = right.country
parent = Node(parent_val, parent_country, left, right)
next_queue.append(parent)
queue = next_queue
# 根节点的左右子节点即为决赛的两个国家
root = queue[0]
left_child = root.left
right_child = root.right
# 亚军是其中较小的那个
if left_child.val < right_child.val:
print(left_child.country)
else:
print(right_child.country)
今天有点累了,后续分析。找到个做题的好地方,洛谷,还是免费的,这点比力扣强。