当前位置:   article > 正文

202203-2 出行计划 (Python 附思路)_出行计划 csdn

出行计划 csdn

题目要求:

70分代码:

  1. # 70分
  2. n,m,k = map(int, input().split()) # 接收n、m、k三个输入
  3. t = []
  4. c = []
  5. q = []
  6. # 接收n个出行计划 ti、ci
  7. for i in range(n):
  8. ti,ci = map(int, input().split())
  9. t.append(ti), c.append(ci)
  10. # 从用户视角出发,计算每个查询对应能去的出行计划有几个
  11. def num(start):
  12. count = 0
  13. for i in range(n):
  14. if start <= t[i] and t[i]-start < c[i]:
  15. count += 1
  16. return count
  17. # 接收m个查询
  18. for i in range(m):
  19. value = int(input())
  20. q.append(value)
  21. # 这样时间复杂度是m×n 会超时
  22. for i in range(m):
  23. print(num(q[i]+k))

满分思路及代码:

跳出传统惯性思维,不从用户角度去逐一计算每个查询能满足多少个出行计划,而是先从出行计划入手,计算对于每个出行计划所满足的q时刻做疫苗时间段:

由题意易知有:q+k\leqslant t< q+k+c

即:q+k\leqslant t \leqslant q+k+c-1

变换后得:t-c-k+1 \leqslant q \leqslant t-k

此时只需要开辟一个大小为200010(注意一定要开多几个,避免越界)的数组q,用于记录对于该出行计划,哪些q时刻是可行的,对这些可行的q都+1,因此这里可以用到差分的思想

图片出自博主“一只可爱的小猴子”

代码

  1. # 100分
  2. n,m,k = map(int, input().split())
  3. t = []
  4. c = []
  5. res = [0]*200010 # 要多开几个防止越界
  6. for i in range(n):
  7. ti,ci = map(int, input().split())
  8. t.append(ti), c.append(ci)
  9. #------------------差分核心部分------------------#
  10. l = max(t[i]-c[i]-k+1,0)
  11. r = max(t[i]-k,0)
  12. res[l] += 1
  13. res[r+1] -= 1
  14. for i in range(1,len(res)):
  15. res[i] += res[i-1] # 前缀和累加
  16. #-----------------------------------------------#
  17. for i in range(m):
  18. value = int(input())
  19. print(res[value])
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/194912
推荐阅读
相关标签
  

闽ICP备14008679号