为什么有些领导一上来就喜欢裁员,把团队里的全部老人都裁掉,再去外面招新人,想啥呢?
刚看到个贴子,说有些领导一上来就喜欢裁员,尤其是把老员工全干掉,再去外面招新人。网友都在骂“卸磨杀驴”,但我觉得这事得分两头看。
很多新官上任,想的是“立威”和“换血”,新人听话、成本低、没包袱,看起来能“焕新气象”;但问题是,团队的经验、人脉、默契都在那些老人身上,一刀切反而容易断掉传承。说白了,这是“换血”变“失血”。
我看到有网友说,这类领导其实是没自信,怕旧人不服自己,所以干脆清空重建。我挺认同。真正有能力的领导,是能用好旧人、带出新人,而不是一味推倒重来。
总的来说,裁员不是错,错的是不看人。会用人的领导,才是真正能带队打仗的。【备注:文末可领最新资料】
面试题:网格图操作后的最大分数
昨晚十一点多我就在公司楼下吹风,手机一震,小李问我:东哥,那个“网格图操作后的最大分数”咋写个通俗点的解法?我嘴一瓢就开始说,呃…你先别走神,思路挺顺。
有个 m×n 的整数网格,每次操作你可以二选一: 1)选一整行,把这行当前元素和加到总分;然后这行每个格子都减去 d。 2)选一整列,同理把列和加到总分;然后这列每个格子都减 d。 一共做 k 次,问能拿的最大分。就这个,挺生活的对吧。
直觉&坑点
你肯定先想“每次挑最大的那一行/列”对吧?行,但有个坑:你先选了 i 次“行”,再去选“列”时,那些交叉点已经被减过 i 次 d 了,列和比你单独算列时要更小。也就是说,行列独立最优 ≠ 全局最优,得补个“重叠惩罚”。
正解就三步,别怕
第一步:用大根堆维护“行和”。每拿一次最大行和进答案,再把它减去 n×d(因为这一行 n 个格子都减 d),压回堆。做 k 次,记录前 i 次的前缀最优总和 R[i]。 第二步:同理对“列和”,每次拿最大列和,再减 m×d,得到 C[j]。 第三步:枚举 i=0..k,表示先取 i 次行、再取 k−i 次列。独立相加后减掉重叠惩罚:i×(k−i)×d。为啥?因为选了 i 行与 (k−i) 列,共有 i×(k−i) 个交叉格,每个交叉因为“先选过的行”被多减了 d,导致后面拿列时少赚 d,统统扣回来就行。
复杂度咋样
建两个堆 O(m + n),每个堆弹 k 次,堆操作 O(log m) / O(log n),总共 O(k log m + k log n)。很能打。
import heapq
from typing import List
defmax_score_after_ops(grid: List[List[int]], k: int, d: int) -> int:
m, n = len(grid), len(grid[0]) if grid else0
# 行和、列和
row_sums = [sum(row) for row in grid]
col_sums = [sum(grid[i][j] for i in range(m)) for j in range(n)]
# Python 没有大根堆,用负号模拟
row_heap = [-x for x in row_sums]
col_heap = [-x for x in col_sums]
heapq.heapify(row_heap)
heapq.heapify(col_heap)
R = [0] * (k + 1) # 前 i 次只拿行的最佳总和
C = [0] * (k + 1) # 前 j 次只拿列的最佳总和
# 预处理行
cur = 0
for i in range(1, k + 1):
top = -heapq.heappop(row_heap)
cur += top
R[i] = cur
heapq.heappush(row_heap, -(top - n * d))
# 预处理列
cur = 0
for j in range(1, k + 1):
top = -heapq.heappop(col_heap)
cur += top
C[j] = cur
heapq.heappush(col_heap, -(top - m * d))
ans = float("-inf")
for i in range(0, k + 1):
j = k - i
# 重叠惩罚:i * j * d
ans = max(ans, R[i] + C[j] - i * j * d)
return ans
# 小测一下
if __name__ == "__main__":
g = [
[5, 4, 3],
[2, 1, 6]
]
print(max_score_after_ops(g, k=3, d=2)) # 随便测个值看看
你看,我先独立地拿“行”算出一个 R[i],这是假装世界里只有行;同理 C[j] 是只有列的世界。把它们相加会把交叉位置当成“没被行削过”的列和来算,明显虚高。每个交叉少算 d,一共有 i×j 个交叉,减掉就正好掐平。
行了行了,我咖啡凉了…你先用这套写题,碰到 d 不同(比如行减的是 d1、列减的是 d2)再叫我,这个惩罚项会变型,但堆+前缀枚举这套骨架不变。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领