鱼C论坛

 找回密码
 立即注册
查看: 18|回复: 1

洛谷3378

[复制链接]
发表于 昨天 23:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我突发奇想用的python列表加bif做的(
结果tle 了,改怎么优化
  1. from sys import stdin

  2. lst=[]
  3. a=stdin.read()
  4. n=int(a.split("\n")[0])
  5. for i in a.split("\n")[1:n+1]:
  6.     if eval(i[0])==1:
  7.         lst.append(int(i.split(' ')[1]))
  8.     elif eval(i[0])==2:
  9.         print(min(lst))
  10.     else:
  11.         lst.remove(min(lst))
  12.         
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 昨天 23:38 | 显示全部楼层
鱼油你好! 你的程序TLE 主要是因为每次查找最小值都调用min(lst)(O(n)),删除最小值时lst.remove(min(lst))也是O(n)扫描两次,整体效率极低。对于洛谷P3378这类需要频繁插入、取最小、删除最小的题目,必须用优先队列(堆)。Python自带heapq模块实现最小堆,插入和删除都是O(log n),能完美避开TLE。

以下是优化后的代码(使用堆,读取用sys.stdin.buffer.read加快速度):


  1. from sys import stdin
  2. import heapq

  3. data = stdin.buffer.read().split()
  4. n = int(data[0])
  5. heap = []
  6. idx = 1  # 当前读取位置

  7. for _ in range(n):
  8.     op = int(data[idx]); idx += 1
  9.     if op == 1:
  10.         x = int(data[idx]); idx += 1
  11.         heapq.heappush(heap, x)
  12.     elif op == 2:
  13.         print(heap[0])  # 堆顶即最小值
  14.     else:  # op == 3
  15.         heapq.heappop(heap)  # 删除最小元素
复制代码


几个要点:
- 不要用eval()处理指令,直接按空格分割取数字即可,速度更快。
- heap[0]就是最小值,且heappop直接移除最小元素。
- 输入用stdin.buffer.read()一次性读取全部,然后用.split()切割,避免逐行处理的开销。

这样修改后,单次操作复杂度降低两个数量级,轻松AC。希望能帮到你~

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-7-27 00:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表