YANGyz

用户名YANGyz
班级
学号2025024827

提交总数 72
通过 46
通过率 63.89%
错误解答 24
时间超限 2
编译错误 0

#1.最大二叉树 class TreeNode:

def __init__(self,val=0,left=None,right=None): self.val = val self.left = left self.right = right

def MaxTree(nums):

if not nums: return None max_val=max(nums) max_index=nums.index(max_val) root = TreeNode(max_val) root.left = MaxTree(nums[:max_index]) root.right = MaxTree(nums[max_index+1:]) return root

def print_tree(root: TreeNode):

if not root: print("null", end=" ") return else: print(root.val, end=" ") if not root.left and not root.right: return else: print_tree(root.left) print_tree(root.right)

nums = list(map(int,input().split())) root = MaxTree(nums) print_tree(root) #2.寻找多数 def result(len,nums):

if not nums: return index=nums[0] sums=1 for i in nums[1:len-1]: if index == i: sums+=1 else: sums-=1 if sums == 0: index = i sums = 1 print(index)

len= int(input()) nums = [int(x) for x in input().split()] result(len,nums) #3.最大子序和 def max_subarray_sum(nums):

""" 计算最大子数组和 """ # 初始化 max_sum = current_sum = nums[0] # 遍历数组(从第二个元素开始) for num in nums[1:]: # 关键决策:是重新开始还是延续当前子数组 current_sum = max(num, current_sum + num) # 更新全局最大值 max_sum = max(max_sum, current_sum) return max_sum

n = int(input()) nums = list(map(int, input().split())) print(max_subarray_sum(nums)) #4.k个最小数 def quicksort(nums):

if len(nums) <= 1 : return nums else: pivot = nums[0] left = [x for x in nums[1:] if x < pivot] right = [x for x in nums[1:] if x >= pivot] return quicksort(left) + [pivot] + quicksort(right)

def result(k,nums):

for i in range (k): print(nums[i],end=" ")

n,k= map(int,input().split()) nums = [int(x) for x in input().split()] sort_nums=quicksort(nums)

result(k,sort_nums) #5.k个最大元素 def quicksort(nums):

if len(nums) <= 1 : return nums else: pivot = nums[0] left = [x for x in nums[1:] if x > pivot] right = [x for x in nums[1:] if x <= pivot] return quicksort(left) + [pivot] + quicksort(right)

n,k= map(int,input().split()) nums = [int(x) for x in input().split()] sort_nums=quicksort(nums) print(sort_nums[k-1]) #6.k个最长重复字符串 def longest_substring(s, k):

if len(s) < k: return 0 from collections import Counter cnt = Counter(s) for c in s: if cnt[c] < k: return max(longest_substring(p, k) for p in s.split(c)) return len(s)

import sys

s, k = sys.stdin.read().split() print(longest_substring(s, int(k)))

#7.链表排序 class ListNode:

def __init__(self, val=0, next=None): self.val = val self.next = next

def sort_list(head):

if not head or not head.next: return head # 快慢指针找中点 slow, fast = head, head.next while fast and fast.next: slow = slow.next fast = fast.next.next mid = slow.next slow.next = None # 归并排序 return merge(sort_list(head), sort_list(mid))

def merge(a, b):

dummy = cur = ListNode() while a and b: if a.val < b.val: cur.next = a a = a.next else: cur.next = b b = b.next cur = cur.next cur.next = a or b return dummy.next

import sys

nums = list(map(int, sys.stdin.read().split()))

if nums:

# 构建链表 head = ListNode(nums[0]) cur = head for x in nums[1:]: cur.next = ListNode(x) cur = cur.next # 排序 head = sort_list(head) # 输出 res = [] while head: res.append(str(head.val)) head = head.next print(' '.join(res))

#8.柠檬水 def charge(bills):

key=1 if bills[0]!=5: key=0 else: five=1 ten=0 for i in bills[1:]: if i == 5: five+=1 elif i ==10: if five <1: key=0 else: five -=1 ten +=1 else: if (ten>=1 and five>=1) : ten-=1 five-=1 elif ten==0 and five>=3: five-=3 else: key=0 if key==0: print("false") else: print("true")

bills = [int(x) for x in input().split()] charge(bills) #9.换硬币 def boin(n):

sum = 50 key=0 for i in range(15): for j in range(20): for k in range(50): if i*7+j*5+k*2==n and i+j+k<sum: sum=i+j+k key=1 if key==0: print(-1) else: print(sum)

n=int(input()) boin(n) #10.走网格

import math m, n = map(int, input().split()) print(math.comb(m + n - 2, m - 1))

#11.6和9 def turnmax(num):

# 将数字转为字符串处理更方便 num_str = str(num) # 找到第一个6的位置,替换为9 for i in range(len(num_str)): if num_str[i] == '6': # 替换第一个6为9 result = num_str[:i] + '9' + num_str[i + 1:] print(int(result)) return # 如果没有6,直接输出原数字 print(num)

num = int(input()) turnmax(num)

#12.括号生成 import sys

def generate_parenthesis(n: int):

res = [] def backtrack(path, left, right): if left == n and right == n: res.append("".join(path)) return if left < n: path.append("(") backtrack(path, left + 1, right) path.pop() if right < left: path.append(")") backtrack(path, left, right + 1) path.pop() backtrack([], 0, 0) return res

def main():

data = sys.stdin.read().strip().split() if not data: print("[]") return n = int(data[0]) if n <= 0: print("[]") return ans = generate_parenthesis(n) print("[" + ", ".join(ans) + "]")

if __name__ == "__main__":

main()

#13.组合问题 def combine(n, k):

def backtrack(start, path): if len(path) == k: result.append(path[:]) # 添加当前组合的副本 return for i in range(start, n + 1): path.append(i) backtrack(i + 1, path) path.pop() result = [] backtrack(1, []) return result

n, k = map(int, input().split()) combinations = combine(n, k)

print(combinations) #14.计算所有子集异或值的总和 def subset_xor_sum(nums):

""" 计算所有子集异或值的总和 """ n = len(nums) total = 0 def backtrack(index, current_xor): nonlocal total # 当前子集的异或值 total += current_xor # 继续添加元素 for i in range(index, n): # 选择 nums[i] backtrack(i + 1, current_xor ^ nums[i]) # 回溯:不选择 nums[i] 已经在循环中处理 backtrack(0, 0) return total

nums = list(map(int, input().split())) print(subset_xor_sum(nums))

#15.分割回文串 def partition(s):

n = len(s) res = [] def dfs(start, path): if start == n: res.append(path[:]) return for end in range(start, n): sub = s[start:end + 1] if sub == sub[::-1]: path.append(sub) dfs(end + 1, path) path.pop() dfs(0, []) return res

s = input().strip()

result = partition(s)

if not result:

print("[]")

else:

formatted = [] for part in result: formatted.append("[" + ", ".join(part) + "]") print("[" + ", ".join(formatted) + "]")

#16.目标和 def find_target_sum_ways(nums, target):

total = sum(nums) # 不可能的情况 if abs(target) > total or (target + total) % 2: return 0 # 计算需要凑的正数和 pos_sum = (target + total) // 2 # dp数组 dp = [0] * (pos_sum + 1) dp[0] = 1 # 背包问题 for num in nums: for j in range(pos_sum, num - 1, -1): dp[j] += dp[j - num] return dp[pos_sum]

nums = list(map(int, input().split())) target = int(input()) print(find_target_sum_ways(nums, target))

#17.组合 def combine(n, k):

def backtrack(start, path): if len(path) == k: result.append(path) return for i in range(start, n + 1): backtrack(i + 1, path + [i]) result = [] backtrack(1, []) return result

n, k = map(int, input().split()) for comb in combine(n, k):

print(' '.join(map(str, comb)))

#18.大礼包 from functools import lru_cache

lines = [list(map(int, input().split())) for _ in range(4)] # 根据样例固定4行

price, m = lines[0][:-1], lines[0][-1] special = lines[1:3] needs = lines[3]

@lru_cache(None) def f(state):

n = len(price) # 直接买 cost = sum(price[i] * state[i] for i in range(n)) # 尝试礼包 for p in special: new_state = list(state) if all(p[i] <= new_state[i] for i in range(n)): for i in range(n): new_state[i] -= p[i] cost = min(cost, p[-1] + f(tuple(new_state))) return cost

print(f(tuple(needs)))

#19.Equal Sum def can_partition_k_subsets(nums, k):

total = sum(nums) if total % k != 0: return False target = total // k nums.sort(reverse=True) if nums[0] > target: return False n = len(nums) used = [False] * n def dfs(start, current_sum, count): """ 深度优先搜索 参数: start: 起始索引 current_sum: 当前子集的和 count: 已完成的子集数量 """ if count == k - 1: # 最后一个子集自动满足 return True if current_sum == target: # 完成一个子集,开始下一个 return dfs(0, 0, count + 1) for i in range(start, n): if not used[i] and current_sum + nums[i] <= target: used[i] = True if dfs(i + 1, current_sum + nums[i], count): return True used[i] = False # 重要剪枝:如果当前数字无法放入,且当前和为0,直接失败 if current_sum == 0: break # 跳过相同数字 while i + 1 < n and nums[i] == nums[i + 1]: i += 1 return False return dfs(0, 0, 0)

nums = list(map(int,input().split())) k = int(input()) print(str(can_partition_k_subsets(nums, k)).lower())

#20.分割等和子集 def can_partition(nums):

total = sum(nums) # 如果总和是奇数,不可能平分 if total % 2 != 0: return False target = total // 2 # 初始化dp数组 dp = [False] * (target + 1) dp[0] = True # 和为0总是可以 # 遍历每个数字 for num in nums: # 从后往前更新,避免重复使用同一个数字 for j in range(target, num - 1, -1): dp[j] = dp[j] or dp[j - num] return dp[target]

if __name__ == "__main__":

# 注意:输入是像 "15115" 这样的字符串 # 将字符串转换为数字列表 # 例如 "15115" → [1, 5, 1, 1, 5] nums = list(map(int, input().split())) # 或者如果输入是空格分隔的数字,用: # nums = list(map(int, input().split())) result = can_partition(nums) print(str(result).lower()) # 输出 true/false

#21.整数拆分 def integer_break(n):

dp = [0] * (n + 1) # 初始化 dp[1] = 1 dp[2] = 1 # 2 = 1 + 1, 乘积1 # 计算dp[3]到dp[n] for i in range(3, n + 1): # 尝试所有拆分方式 for j in range(1, i): # 不继续拆分 vs 继续拆分 dp[i] = max(dp[i], max(j * (i - j), j * dp[i - j])) return dp[n]

n = int(input()) print(integer_break(n))

#22.打家劫舍 def rob(nums):

n = len(nums) if n == 0: return 0 if n == 1: return nums[0] # 初始化dp数组 dp = [0] * n dp[0] = nums[0] dp[1] = max(nums[0], nums[1]) # 状态转移 for i in range(2, n): dp[i] = max(dp[i - 1], dp[i - 2] + nums[i]) return dp[-1]

nums = list(map(int, input().split())) print(rob(nums))

#23.戳气球 def max_coins_simple(nums):

# 添加边界气球 nums = [1] + nums + [1] n = len(nums) # dp[i][j] 表示戳破 (i, j) 区间内气球的最大得分 dp = [[0] * n for _ in range(n)] # 区间长度从3开始(因为两端是虚拟气球,实际至少包含1个气球) for length in range(2, n): # 注意这里是2,因为开区间(i,j)至少有一个气球时j-i>=2 for i in range(0, n - length): j = i + length # 尝试每个位置作为最后一个戳破的 for k in range(i + 1, j): # 最后戳破k:左边得分 + 右边得分 + 戳破k的得分 score = dp[i][k] + dp[k][j] + nums[i] * nums[k] * nums[j] dp[i][j] = max(dp[i][j], score) return dp[0][n - 1]

nums = list(map(int, input().split())) print(max_coins_simple(nums))

#24.三数之和 def three_sum(nums):

nums.sort() res = [] n = len(nums) for i in range(n - 2): if i > 0 and nums[i] == nums[i - 1]: continue if nums[i] > 0: break left, right = i + 1, n - 1 while left < right: total = nums[i] + nums[left] + nums[right] if total == 0: res.append([nums[i], nums[left], nums[right]]) while left < right and nums[left] == nums[left + 1]: left += 1 while left < right and nums[right] == nums[right - 1]: right -= 1 left += 1 right -= 1 elif total < 0: left += 1 else: right -= 1 return res

n = int(input()) nums = list(map(int, input().split())) result = three_sum(nums) out = "[" + ",".join("[" + ",".join(map(str, t)) + "]" for t in result) + "]" print(out)

#25.反转括号 def reverse_parentheses(s):

stack = [] for ch in s: if ch == ')': # 找到括号内的内容并反转 temp = [] while stack[-1] != '(': temp.append(stack.pop()) stack.pop() # 弹出 '(' stack += temp else: stack.append(ch) return ''.join(stack)

s = input() print(reverse_parentheses(s))

#26.跳跃游戏 def min_jumps(n, nums):

if n <= 1: return 0 jumps = 0 # 跳跃次数 current_end = 0 # 当前跳跃能到达的最远位置 farthest = 0 # 所有选择中能到达的最远位置 # 注意:不需要遍历最后一个位置 for i in range(n - 1): # 更新能跳到的最远位置 farthest = max(farthest, i + nums[i]) # 如果到达当前跳跃的边界 if i == current_end: jumps += 1 current_end = farthest # 如果已经可以到达最后一个位置 if current_end >= n - 1: break return jumps

n = int(input()) nums = list(map(int, input().split())) print(min_jumps(n, nums))

#27.颜色分类 def color(n,nums):

if not nums: return k=0 key=0 for i in range(k,n): if nums[i]==0: key=nums[i] nums[i]=nums[k] nums[k]=key k+=1 for i in range(k,n): if nums[i]==1: key=nums[i] nums[i]=nums[k] nums[k]=key k+=1 # 剩下的2已经在末尾 print("[" + ",".join(map(str, nums)) + "]")

n= int(input()) nums = [int(x) for x in input().split()] color(n,nums) #28.找假币 def find_fake_coin(n, a):

min_weight = min(a) # 返回第一个最小重量出现的位置(1-based) for i in range(n): if a[i] == min_weight: return i + 1

n = int(input()) a = list(map(int, input().split())) print(find_fake_coin(n, a)) #29.最少操作使数组递增 def dizeng():

n=int(input()) nums=list(map(int,input().split())) k=nums[0] count=0 for i in range(1,n): if nums[i]<=k: len=k-nums[i] count=count+len+1 k=nums[i]+len+1 else: k=nums[i] return count

print(dizeng()) #30.买鸡问题 def buy_chicken(n,k):

key=0 for i in range(100): for j in range(100): for y in range(0,100,3): if (5*i+3*j+y/3==n) and (i+j+y==k): print(i,j,y,sep=" ") key=1 if key==0: print(0)

n,k=map(int,input().split()) buy_chicken(n,k) #31.组合求和 def main():

k, n = map(int, input().split()) res = [] def dfs(start, path, s): if len(path) == k: if s == n: res.append(path.copy()) return for i in range(start, 10): if s + i > n: break path.append(i) dfs(i + 1, path, s + i) path.pop() dfs(1, [], 0) if not res: print(0) else: for c in sorted(res, reverse=True): print(' '.join(map(str, c)))

if __name__ == "__main__":

main()

#32.完全平方数 def numSquares(n: int):

# 初始化dp数组,dp[i]表示和为i需要的最少平方数 dp = [float('inf')] * (n + 1) dp[0] = 0 # 遍历1到n for i in range(1, n + 1): # 尝试所有可能的完全平方数 j = 1 while j * j <= i: dp[i] = min(dp[i], dp[i - j * j] + 1) j += 1 return dp[n]

if __name__ == "__main__":

n = int(input().strip()) print(numSquares(n))

#33.饼干 def bingan():

# 读取输入:g是孩子胃口,s是饼干大小 g = list(map(int, input().split())) s = list(map(int, input().split())) # 排序:从小到大 g.sort() s.sort() child = 0 # 当前孩子的索引 cookie = 0 # 当前饼干的索引 count = 0 # 满足的孩子数量 # 双指针贪心算法 while child < len(g) and cookie < len(s): if s[cookie] >= g[child]: # 当前饼干可以满足当前孩子 count += 1 child += 1 # 下一个孩子 cookie += 1 # 无论是否满足,都要看下一个饼干 return count

print(bingan())

#34.电话 def letterCombinations(digits: str):

if not digits: return [] phone_map = { '2': "abc", '3': "def", '4': "ghi", '5': "jkl", '6': "mno", '7': "pqrs", '8': "tuv", '9': "wxyz" } result = [] def backtrack(index, path): if index == len(digits): result.append(path) return for letter in phone_map[digits[index]]: backtrack(index + 1, path + letter) backtrack(0, "") result.sort() # 按字母顺序排序 return result

if __name__ == "__main__":

digits = input().strip() combinations = letterCombinations(digits) # 按照样例格式输出 output_str = "[" + ", ".join(combinations) + "]" print(output_str)

#35.优美排列 def countArrangement_backtrack(n: int) -> int:

used = [False] * (n + 1) count = 0 def backtrack(pos): nonlocal count if pos > n: count += 1 return for num in range(1, n + 1): if not used[num]: if (num % pos == 0 or pos % num == 0): used[num] = True backtrack(pos + 1) used[num] = False backtrack(1) return count

if __name__ == "__main__":

n = int(input().strip()) print(countArrangement_backtrack(n))

#36.背包问题 N, c = map(int, input().split()) W = list(map(int, input().split())) V = list(map(int, input().split()))

dp = [0] * (c + 1)

for i in range(N):

for j in range(c, W[i] - 1, -1): dp[j] = max(dp[j], dp[j - W[i]] + V[i])

print(dp[c])

#37.最长回文字 def longestPalindrome(s: str) -> str:

if not s: return "" start = 0 max_len = 1 def expand_around_center(left: int, right: int) -> int: """从中心向两边扩展,返回回文长度""" while left >= 0 and right < len(s) and s[left] == s[right]: left -= 1 right += 1 return right - left - 1 for i in range(len(s)): # 奇数长度的回文 len1 = expand_around_center(i, i) # 偶数长度的回文 len2 = expand_around_center(i, i + 1) # 取较长的那个 curr_len = max(len1, len2) if curr_len > max_len: max_len = curr_len start = i - (curr_len - 1) // 2 return s[start:start + max_len]

if __name__ == "__main__":

s = input().strip() print(longestPalindrome(s))

#38.连续数组最大和 def result(n,nums):

max_sum=nums[0] current_sum=nums[0] for i in range(n): current_sum = max(nums[i],current_sum+nums[i]) max_sum = max(max_sum,current_sum) return max_sum

n=int(input()) nums=list(map(int,input().split()))

print(result(n,nums))

未解答 0 Problems
没有找到数据。