python编程大赛规则_2020 力扣杯!Code Your Future 春季全国编程大赛 - python 代码

这篇博客详细讲解了五道算法题,包括硬币计数问题、传递信息的路径计算、剧情触发时间的确定、最小跳跃次数求解及二叉树任务调度。通过示例代码,阐述了如何利用位操作、图遍历、二分查找等技巧来解决问题,并展示了不同解题思路。
摘要由CSDN通过智能技术生成

第一题 拿硬币

class Solution:

def minCount(self, coins) -> int:

cnt = 0

for x in coins:

cnt += x >> 1

cnt += x & 1

return cnt

第二题 传递信息

class Solution:

def numWays(self, n: int, relation: List[List[int]], k: int) -> int:

x = [0]

m = {}

for r in relation:

if r[0] not in m:

m[r[0]] = [r[1]]

else:

m[r[0]].append(r[1])

for i in range(k):

xx = []

for c in x:

if c in m:

xx.extend(m[c])

# print(xx)

x = xx

cnt = 0

for xxx in x:

if xxx == n-1:

cnt += 1

return cnt

第三题 LCP 08. 剧情触发时间

import bisect

class Solution:

def getTriggerTime(self, increase: List[List[int]], requirements: List[List[int]]) -> List[int]:

c = [0]

r = [0]

h = [0]

for cc, rr, hh in increase:

c.append(c[-1] + cc)

r.append(r[-1] + rr)

h.append(h[-1] + hh)

# print(c)

# print(r)

# print(h)

a = []

for cc, rr, hh in requirements:

ct = bisect.bisect_left(c, cc)

rt = bisect.bisect_left(r, rr)

ht = bisect.bisect_left(h, hh)

xx = max([ct, rt, ht])

if xx == len(c): xx = -1

a.append(xx)

return a

第四题 最小跳跃次数

class Solution:

def minJump(self, jump: List[int]) -> int:

l = len(jump)

outi = []

to = {}

fr = {}

ddd = [-1] * l

for i in range(l):

d = i + jump[i]

if d >= l:

outi.append(i)

else:

to[i] = d

if d in fr:

fr[d].append(i)

else:

fr[d] = [i]

mi = min(outi)

import queue

q = queue.PriorityQueue()

for oi in outi:

ddd[oi] = 0

q.put((0, oi))

# print(q.queue)

# print(fr)

cm = l

while True:

i, n = q.get()

# print(i, n)

if n == 0:

break

for j in range(n+1, cm):

if ddd[j] == -1 or ddd[j] > i+1:

# print('%d -> %d' %(n, j))

q.put((i+1, j))

ddd[j] = i+1

cm = min(cm, n)

if n in fr:

for f in fr[n]:

# print(f,'f')

if ddd[f] == -1 or ddd[f] > i+1:

ddd[f] = i+1

# print('%d -> %d' %(n, f))

q.put((i+1, f))

return i+1

第五题 二叉树任务调度

两篇都是 dfs,但思路不太一样,第一篇是把每棵树的时间分为单核时间(就是不能并行的时间)和双核时间,答案是二者的和;第二篇是分别计算每棵子树最短时间和所有任务的合计时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值