好啦~现在回来找bug了!
285没有上司的舞会
又对了一遍代码发现没错。
后来发现是这个原因
setrecursionlimit
‘在网上查了,发现python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常:RuntimeError: maximum recursion depth exceeded。
解决的方式是手工设置递归调用深度,方式为:
import sys
sys.setrecursionlimit(1000000) #例如这里设置为一百万’
import sys
sys.setrecursionlimit(1000000)
N = 6010
hy = [0]*N
h,e,ne,idx = [-1]*N, [0]*N, [0]*N,0
f = [[0]*2 for _ in range(N)]
# 题中并未直接告诉我们谁是父节点,需要用这个数组去判断
# father[a]代表a有无父节点
father = [False]*N
def add(a,b):
global idx
idx += 1
e[idx] = b
ne[idx] = h[a]
h[a] = idx
def dfs(u):
f[u][1] = hy[u]
i = h[u]
while i !=-1:
j = e[i]
dfs(j)
f[u][0] += max(f[j][0],f[j][1])
f[u][1] += f[j][0]
i = ne[i]
n = int(input())
# 读入职员快乐指数
for i in range(1,1+n):
hy[i] = int(input())
for _ in range(n-1):
a,b = map(int,input().split())
father[a] = True
add(b,a)
# 从1号员工开始找整棵树的父节点,也就是没有父节点的那个节点
root = 1
while father[root]:
root +=1
dfs(root)
print(max(f[root][0], f[root][1]))
901滑雪
虽然可以看懂代码,但是还是不懂,记忆化搜索到底指的是什么。
N = 310
f = [[-1]*N for _ in range(N)]
g = [[0]*N for _ in range(N)]
dx =[-1,0,1,0]
dy = [0,1,0,-1]
def dp(x,y):
if f[x][y]!=-1:
return f[x][y]
f[x][y] = 1
for i in range(4):
a,b = x + dx[i],y+dy[i]
if 1<=a<=n and 1<=b<=m and g[a][b]<g[x][y]:
f[x][y] = max(f[x][y], dp(a,b) + 1)
return f[x][y]
n,m = map(int,input().split())
for i in range(1,n+1):
g[i] = [0] + list(map(int,input().split()))
res = 0
for i in range(1,n+1):
for j in range(1,m+1):
res = max(res, dp(i,j))
print(res)
记忆化搜索:空间换时间。在这是用f[x][y]的空间换取时间嘛???如果别人需要用的时候,就直接返回??
到贪心啦!!!
905区间选点
li =[]
n = int(input())
for _ in range(n):
a,b = map(int,input().split())
li.append((a,b))
li.sort(key = lambda x:x[1])
res = 0
idx = -2e9
for i in range(n):
if li[i][0]>idx:
res += 1
idx = li[i][1]
print(res)
908最大不相交区间数量
li = []
n = int(input())
for _ in range(n):
a,b = map(int,input().split())
li.append((a,b))
li.sort(key = lambda x:x[1])
idx = -2e9
res = 0
for i in range(n):
if li[i][0]>idx:
res += 1
idx = li[i][1]
print(res)
906区间分组
bash
import heapq
这题学习了一下heapq如何使用
包括heapfy\heappush\heapreplace
N = 100010
li = []
n = int(input())
for _ in range(n):
l,r =map(int,input().split())
li.append((l,r))
li.sort()
q = []
heapify(heap) 将heap属性强制应用到任意一个列表
heapq.heapify(q)
for i in range(n):
if (not q or q[0]>=li[i][0]):
heapq.heappush(q,li[i][1])
else:
heapq.heapreplace(q,li[i][1])
print(len(q))
148合并果子
为什么学的时候觉得和之前的那个合并石子很像呢
用堆好方便啊!
import heapq
n = int(input())
q = list(map(int,input().split()))
res = 0
heapq.heapify(q)
# 最后只剩下一个,就不用搬了~
while len(q)>1:
a = heapq.heappop(q)
b = heapq.heappop(q)
res += a+b
# 神奇的是,a+b会自己找位置叭~
heapq.heappush(q,a+b)
print(res)```
## 913排队打水
```bash
n = int(input())
a = list(map(int,input().split()))
res = 0
a.sort()
for i in range(n):
# 第i+1个人后面有n-i-1个人在等待
res += a[i]*(n-i-1)
print(res)
104货仓选址
n = int(input())
li = list(map(int,input().split()))
li.sort()
res = 0
for i in range(n):
res += abs(li[i]-li[n//2])
print(res)
125耍杂技的牛
N = 50010
f = []
n = int(input())
for _ in range(n):
w,s = map(int,input().split())
f.append((w,s))
# 第一次见这种key
f.sort(key = lambda x:x[0]+x[1])
sum = 0
res = -2e9
for i in range(n):
w = f[i][0]
s = f[i][1]
res = max(res,sum - s)
sum += w
print(res)
偶吼吼或或或或或或或或或或或或或或或或或或或
终于打卡完成啦!!!
不知不觉,在ACWING上打卡了73道题了,真的很棒!!!
要再开一篇文章进行复习啦~
从正式开始acwing算法基础课,到现在整整一个月啦~期间有过很emo的时刻,但是好在自己没放弃!还有一周就考蓝桥啦!!!无论结果如何,这一路上收获很多呀!希望自己可以再好好复习一下之前的代码,还不是很熟悉!加油!!!