我弟国企的工资,看完一点都不羡慕了~
“国企稳定”这四个字,真到工资条上,有时候稳定得人都沉默了。网友吐槽自己弟弟在国企,实发1930,看完那张工资单,滤镜直接碎一地。你说轻松吧,也未必;你说体面吧,这数字拿去交房租都得先深呼吸一下。
评论区也挺真实。有人说,国企不是不能去,是得看岗、看地区、看有没有补贴,不然真容易拿着“好单位”的名头,过着月月精打细算的日子。
我一直觉得,很多人羡慕国企,羡慕的不是工资,是那个“听起来不错”。可问题是,听起来不错不能当饭吃,稳定也不能自动补上生活成本。尤其年轻人刚进场,工资低成这样。说白了,工作这东西,名头是给别人看的,到账金额才是给自己活的。
算法题:隔离病毒
这题“隔离病毒”,本质是个模拟 + 连通块搜索。每一轮要做四件事:
先把当前所有病毒连通块找出来; 再分别算出每个连通块下一轮能感染哪些空白格; 选出威胁最大的那一块,给它彻底封死; 剩下的块继续向外扩散。
真正容易写歪的地方有两个。一个是“威胁最大”比的不是病毒格数量,而是它能感染的空白格数量。另一个是修墙数量,算的是边界上病毒格和空白格之间的接触边数,不是空白格个数。
代码我一般会这样写,先把一轮里所有区域的信息扫出来:
defexplore(grid, i, j, vis):
m, n = len(grid), len(grid[0])
stack = [(i, j)]
vis.add((i, j))
cells = []
frontier = set()
walls = 0
while stack:
x, y = stack.pop()
cells.append((x, y))
for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):
nx, ny = x + dx, y + dy
ifnot (0 <= nx < m and0 <= ny < n):
continue
if grid[nx][ny] == 1and (nx, ny) notin vis:
vis.add((nx, ny))
stack.append((nx, ny))
elif grid[nx][ny] == 0:
frontier.add((nx, ny))
walls += 1
return cells, frontier, walls
这里 frontier 是这片区域下一轮能感染到的格子,walls 是需要修的墙数。一个空白格可能被同一个区域从两侧贴上,所以 frontier 去重,walls 不能去重,这地方很多人会算错。
主体流程也不复杂,按轮模拟:
classSolution:
defcontainVirus(self, isInfected):
m, n = len(isInfected), len(isInfected[0])
ans = 0
whileTrue:
vis = set()
regions = []
for i in range(m):
for j in range(n):
if isInfected[i][j] == 1and (i, j) notin vis:
regions.append(explore(isInfected, i, j, vis))
ifnot regions:
break
idx = max(range(len(regions)), key=lambda k: len(regions[k][1]))
if len(regions[idx][1]) == 0:
break
ans += regions[idx][2]
for k, (cells, frontier, _) in enumerate(regions):
if k == idx:
for x, y in cells:
isInfected[x][y] = -1
else:
for x, y in frontier:
isInfected[x][y] = 1
return ans
我比较喜欢把被隔离的格子标成 -1,这样后面扫描时一眼就知道这块已经封死了,不会再参与扩散。别继续用 1,不然后面逻辑会绕。
这题不算什么高深算法,DFS 也不难,难的是一轮状态要收集完整。你不能边扫边扩散,也不能刚发现一块危险区就立刻动手封,不然同一轮的数据就乱了。老老实实先统计,再决策,再更新,代码才稳。