蓝桥杯python:砝码称重

题目:在这里插入图片描述
程序说明:
创建一个一维列表来记录状态,后面可以把上一层的状态复制拷贝成新的,然后在之后就直接在新的上面进行操作,这样是防止重复使用同一个砝码。

全部代码:

n=int(input())
li = list(map(int, input().split()))
Len = sum(li)
res = [0 for _ in range(Len + 1)]
res[0] = 1
for i, k in enumerate(li):
    nres = res.copy()
    for j in range(Len + 1):
        if res[j]:
            temp = j + k
            if temp <= Len:
                nres[temp] = 1
            temp = j - k
            nres[abs(temp)] = 1
    res = nres
print(sum(res[1:]))
<think>好的,我现在需要帮用户整理蓝桥杯Python组A组的常用代码模板、优化技巧和注意事项。首先,我应该先回想一下蓝桥杯的比赛特点,尤其是A组的难度通常较高,涉及算法和数据结构较多。 用户可能需要的代码模板包括基础算法,比如排序、二分查找、DFS、BFS、动态规划、贪心等。此外,优化技巧也很重要,比如输入输出加速、记忆化搜索、剪枝等。注意事项可能涉及Python的特性,如递归深度限制、列表性能等。 先考虑基础算法部分。排序算法中,快排和归并是常考的,但Python内置的sort函数已经优化得很好,可能只需要提醒用户使用sorted或list.sort()。二分查找的模板需要准确处理边界条件,比如左右区间的闭合情况。DFS和BFS的模板需要区分递归和队列的实现,以及如何避免重复访问。动态规划方面,背包问题、最长子序列等可能需要模板,同时注意状态转移方程的实现。贪心算法可能没有固定模板,但需要举例如区间调度或哈夫曼编码。 然后是优化技巧。输入输出方面,Python的input较慢,使用sys.stdin.readline会更快,尤其是在大量数据时。递归深度限制可能需要设置sys.setrecursionlimit,但要注意栈溢出。记忆化可以用lru_cache装饰器,但参数必须是不可变类型。循环优化方面,尽量减少循环内的操作,用列表推导或生成器表达式。空间优化,比如滚动数组,在DP中常见。预处理和剪枝在搜索问题中很重要,比如提前计算素数表或排列组合。 接下来是注意事项。Python的递归深度默认是1000,蓝桥杯的题目如果数据量大,可能会超过这个限制,需要调整。列表访问速度,尽量用索引而非pop(0)等操作,可以用deque代替列表实现队列。全局变量在递归中使用时需要注意是否需要nonlocal或global声明。浮点数精度问题,比较时使用相减绝对值小于一个极小值。时间复杂度分析,Python本身较慢,需要选择更优算法,比如O(n^2)可能在n=1e4时超时,而O(n)或O(nlogn)更安全。 代码模板部分,每个算法给出示例。比如二分查找,给出左右闭合区间和循环结束条件。DFS用递归实现,BFS用队列。并查集的路径压缩和按秩合并。快速幂的递归和迭代版本。动态规划中的背包问题,01背包和完全背包的状态转移。图算法中的Dijkstra和Floyd,但Python可能需要用堆优化Dijkstra。 还要考虑Python的一些特性,比如lru_cache的使用,但递归层数多或者参数大时会占用内存,甚至变慢。在深搜时,如果节点数过多,递归可能栈溢出,需要改为迭代方式。 最后是总结部分,需要把这些内容分门别类,结构清晰,用代码块展示关键模板,同时提醒用户注意常见问题,如输入输出加速,递归深度等。可能还需要提醒测试用例的边界情况,比如n=0或1的时候,数组越界等问题。 在组织回答时,先分大类:常用代码模板、优化技巧、注意事项,每个大类下再分小点,每个小点给出代码示例和解释。确保代码符合LaTeX格式,行内公式用$...$,独立公式用$$...$$,但用户的问题中可能不需要太多数学公式,所以主要关注代码模板的展示,但如果有算法中的数学表达式,比如状态转移方程,需要正确格式化。 检查是否有遗漏的部分,比如图算法中的拓扑排序、最小生成树等,但可能A组更侧重动态规划和搜索。另外,数论相关的模板,如欧几里得算法、素数筛法,也可能需要包含。 最后确保所有建议符合Python的最佳实践,并且在蓝桥杯比赛环境下可行,比如某些库函数是否允许使用,但通常蓝桥杯允许使用标准库,所以sys、collections、heapq等是可以用的。</think>以下是针对蓝桥杯Python组(尤其是A组)的代码模板、优化技巧和注意事项整理,结合算法高频考点和Python语言特性: --- ### 一、常用代码模板 #### 1. **基础算法模板** - **二分查找** ```python def binary_search(arr, target): left, right = 0, len(arr) - 1 while left <= right: mid = (left + right) // 2 if arr[mid] == target: return mid elif arr[mid] < target: left = mid + 1 else: right = mid - 1 return -1 ``` - **快速排序(分治思想)** ```python def quick_sort(arr): if len(arr) <= 1: return arr pivot = arr[len(arr)//2] left = [x for x in arr if x < pivot] middle = [x for x in arr if x == pivot] right = [x for x in arr if x > pivot] return quick_sort(left) + middle + quick_sort(right) ``` - **DFS(深度优先搜索)** ```python def dfs(node, visited): if node in visited: return visited.add(node) for neighbor in graph[node]: dfs(neighbor, visited) ``` - **BFS(广度优先搜索)** ```python from collections import deque def bfs(start): queue = deque([start]) visited = set([start]) while queue: node = queue.popleft() for neighbor in graph[node]: if neighbor not in visited: visited.add(neighbor) queue.append(neighbor) ``` --- #### 2. **动态规划模板** - **背包问题(01背包)** ```python def knapsack(weights, values, capacity): n = len(weights) dp = [0] * (capacity + 1) for i in range(n): for j in range(capacity, weights[i]-1, -1): dp[j] = max(dp[j], dp[j - weights[i]] + values[i]) return dp[capacity] ``` - **最长公子序列(LCS)** ```python def lcs(text1, text2): m, n = len(text1), len(text2) dp = [[0]*(n+1) for _ in range(m+1)] for i in range(1, m+1): for j in range(1, n+1): if text1[i-1] == text2[j-1]: dp[i][j] = dp[i-1][j-1] + 1 else: dp[i][j] = max(dp[i-1][j], dp[i][j-1]) return dp[m][n] ``` --- #### 3. **图论算法模板** - **Dijkstra最短路径(堆优化版)** ```python import heapq def dijkstra(graph, start): distances = {node: float('inf') for node in graph} distances[start] = 0 heap = [(0, start)] while heap: current_dist, current_node = heapq.heappop(heap) if current_dist > distances[current_node]: continue for neighbor, weight in graph[current_node].items(): distance = current_dist + weight if distance < distances[neighbor]: distances[neighbor] = distance heapq.heappush(heap, (distance, neighbor)) return distances ``` - **并查集(路径压缩+按秩合并)** ```python class UnionFind: def __init__(self, size): self.parent = list(range(size)) self.rank = [0] * size def find(self, x): if self.parent[x] != x: self.parent[x] = self.find(self.parent[x]) return self.parent[x] def union(self, x, y): root_x = self.find(x) root_y = self.find(y) if root_x == root_y: return if self.rank[root_x] < self.rank[root_y]: self.parent[root_x] = root_y else: self.parent[root_y] = root_x if self.rank[root_x] == self.rank[root_y]: self.rank[root_x] += 1 ``` --- ### 二、优化技巧 1. **输入输出加速** ```python import sys input = sys.stdin.readline # 读大量数据时效率提升明显 ``` 2. **记忆化搜索** ```python from functools import lru_cache @lru_cache(maxsize=None) def dfs(params): # 递归函数体 ``` 3. **空间换时间** - 预处理素数表、阶乘表等(例如欧拉筛法)。 4. **循环优化** - 避免多层嵌套循环,优先使用生成器或内置函数(如`itertools`)。 --- ### 三、注意事项 1. **递归深度限制** Python默认递归深度为1000,若题目需要深递归(如DFS树遍历),需手动扩展: ```python import sys sys.setrecursionlimit(100000) ``` 2. **列表性能问题** - 避免频繁使用`pop(0)`(复杂度$O(n)$),改用`collections.deque`。 3. **全局变量与局部变量** 在递归函数中修改全局变量时需用`global`声明,闭包中需用`nonlocal`。 4. **浮点数精度** 比较浮点数时用误差判断: ```python if abs(a - b) < 1e-6: # 而非直接 a == b ``` 5. **时间复杂度估算** Python每秒约处理$10^6$次操作,若数据规模$n=10^5$,需选择$O(n)$或$O(n \log n)$算法。 --- ### 四、总结 蓝桥杯A组题目常考动态规划、图论、搜索与数学题,建议: 1. **熟记模板**:如Dijkstra、并查集、背包问题等。 2. **针对性刷题**:重点练习历年真题(如砝码称重、括号序列等)。 3. **实战模拟**:限时训练,适应比赛节奏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值