「alfr round 3」b:巧用贪心与栈,求解序列swap & delete最小操作数
为了解决这个问题,我们可以考虑使用贪心算法和栈数据结构来模拟操作过程,以达到最小操作次数。 下面是解决问题的Python代码: ```python def min_operations(t, test_cases): results = [] for case in test_cases: n = case[0] a = case[1] stack = [] # 用于模拟操作的栈 visited = set() # 记录已经访问过的元素(即已经在栈中) operations = 0 # 记录操作次数 for num in a: if num in visited: # 如果当前数字已经在栈中,则找到栈中对应的索引并进行删除操作 start_idx = None for i, val in enumerate(stack): if val == num: start_idx = i break # 删除从start_idx到当前栈顶的所有元素(模拟删除操作) stack = stack[:start_idx] operations += 1 else: # 否则,将数字压入栈中(模拟交换操作,但实际上是直接放入) stack.append(num) visited.add(num) # 栈中剩余的每个元素都需要单独删除(模拟删除一个元素的操作) # 因为题目要求最终序列为空,而栈中剩余的元素不能通过删除相同元素的操作去除 # 所以每个剩余元素都需要通过一次删除一个元素的操作去除 while stack: stack.pop() operations += 1 results.append(operations) return results # 读取输入 import sys input = sys.stdin.read data = input().split() t = int(data[0]) index = 1 test_cases = [] for _ in range(t): n = int(data[index]) index += 1 a = list(map(int, data[index:index+n])) index += n test_cases.append((n, a)) # 输出结果 results = min_operations(t, test_cases) for res in results: print(res) ``` 额外需要注意的逻辑点: 1. 栈的使用:我们使用栈来模拟序列的变化过程,因为栈的LIFO(后进先出)特性非常适合模拟删除连续相同元素的操作。 2. visited集合:使用集合来记录已经访问过的元素(即在栈中的元素),以便快速判断当前元素是否已经在栈中,从而决定执行删除操作还是压栈操作。 3. 剩余元素的删除:在遍历完所有元素后,栈中可能还剩余一些元素。这些元素不能通过删除相同元素的操作去除,因此每个剩余元素都需要通过一次删除一个元素的操作去除。这部分操作次数需要额外计算。 ######[AI写代码神器 | 637点数解答 | 2024-12-21 14:56:50]
- 「alfr round 3」b:巧用贪心与栈,求解序列swap & delete最小操作数(百度文心 | 637点数解答 | 2024-12-21 14:56:50)343
- ALFR Round 3:巧用贪心与栈求解序列清空最小操作数(百度文心 | 969点数解答 | 2024-12-21 14:56:57)365
- 「alfr round 3」:揭秘长序列通过交换与删除操作清空的最小操作数(百度文心 | 1279点数解答 | 2024-12-21 14:57:07)423
- 「alfr round 3」:巧用算法求解b swap & delete序列清空最小操作数(百度文心 | 2038点数解答 | 2024-12-21 14:57:39)373
- 求解特定条件下整数序列的最小值:算法分析与代码实现(字节豆包 | 746点数解答 | 2026-01-24 13:14:40)97
- C 语言代码:补充函数实现变量值交换及注意要点揭秘(字节豆包 | 174点数解答 | 2024-12-12 00:37:54)185
- C 语言:实现 swap 函数完成两变量交换的代码及逻辑要点(字节豆包 | 121点数解答 | 2024-12-15 19:32:57)228
- C语言:实现输入实数和运算符计算表达式值,处理除数为0情况(字节豆包 | 209点数解答 | 2024-10-30 16:14:46)164
- 给定一个包含 个顶点和 条边的无向连通图。如果除了最多一个顶点外,其余所有顶点的度数均为 或 (即不超过一个顶点的度数大于 ),则称其为胡须图。顶点的度数表示和该顶点相连的边的数量。 每条边要么是黑色,要么是白色。所有边初始均为黑色。 现给定一张胡须图的描述,你需要处理下列类型的若干操作: 将编号为 的边涂成黑色。编号 的边指输入顺序的第 条边。保证进行该操作时第 条边是白色。 将编号为 的边涂成白色。保证进行该操作时第 条边是黑色。 查询只经过黑色边,顶点 和 间的最短路径长度,或判断是否不存在这样的路径(路径长度为经过的边数)。 顶点从 到 编号,边从 到 编号。 输入格式 输入的第一行包含一个整数 ( )——图的顶点数。接下来 行,每行两个整数 ( ),表示一条边。保证图连通、是胡须图、无自环、无重边。 之后一行为整数 ( )——操作数。接下来 行,每行为一次操作。每次操作格式如下: 若为操作类型 ,则该行为 1 i,表示将编号为 的边涂为黑色。 若为操作类型 ,则该行为 2 i,表(讯飞星火 | 0点数解答 | 2026-05-30 13:01:05)25
- 旅行售货员问题:详细步骤剖析与贪心算法Python代码实现(字节豆包 | 444点数解答 | 2024-12-17 03:32:59)325
- Dev C++ 实现旅行售货员问题:最小路程路线代码与详细解析 (字节豆包 | 448点数解答 | 2024-12-17 03:33:42)210
- C++ 求解 P1020 小核桃与删除字符串问题:双指针与枚举策略 (字节豆包 | 330点数解答 | 2026-02-07 18:40:10)55