比裁员更让人憋屈的事出现了。。
刚刷到个程序员吐槽:部门裁员俩高薪的,剩下的活全给工资最低的员工,结果一提涨薪还成了“异端”。这事真的是让人无语😅。
我觉得这套路在IT圈太常见了。管理层总觉得工程师像服务器一样随时能扩容,活越堆越多,钱却一分不涨。网友有的说“忍忍就过去了”,也有人劝赶紧跑路。但说到底,这种“加量不加价”的活法,和线上薅羊毛没区别,老板算盘打得飞起,员工被当“性价比”用。
换位思考下,其实问题根子是价值和尊重没挂钩。你能顶俩人干,却没得到应有的回报,那就是被“薅”了,还不如早点觉醒:该谈条件就谈条件,不谈就学会保护自己。钱少事多情绪还被PUA,真没啥意思。【备注:文末可领最新资料】
面试题:最大得分
其实说起来,这种题目我每次坐地铁都会刷两道,越简单越容易走神,越难的就想放弃。不过这题思路吧,说穿了就是你要从一堆数里挑,最后组合起来分数要最大,说着不复杂,真下手写起来各种边界情况又闹心。
我先举个生活中的例子哈。就像点外卖,你手里有一堆外卖券,假设每张券搭配不一样的餐厅用省的钱最多,这不就类似“最大得分”吗?你不能只顾着哪个菜好吃,还得算搭配哪张券最省钱。最后省得最多,那就是最大得分了。公司小马经常点外卖就是这么算计的,号称一天省30,结果吃多胖十斤。反正算法世界就是这样现实...
扯远了,说回正题。题目一般是给你两个等长的数组,比如A和B,要求你从这俩数组中各选n个元素进行某种操作(比如A[i]*B[i]),再把这些结果加起来,求能拿到的最大分数。其实类似的变体挺多,啥A和B长度不一样、可不可以跳着选、顺序要不要保持、限制啥啥啥的,反正核心就是“挑最优组合”。
我一般的第一反应就是暴力枚举,试试呗,把所有组合都试一遍。但是人老了,手都抖,枚举得太多直接超时,根本不现实。像我那天凌晨快两点还在那试,结果电脑直接风扇狂响。
后来想想,其实这里面隐含了一个决策过程:每一步你都要决定——这个元素选不选?选了之后下一个怎么处理?明显是典型的动态规划场景。用人话说,就是你得把每种选择带来的分数记下来,后面的决策依赖于前面的选择。
动态规划咋搞?状态一般是你已经挑了几个数(假设是j个),当前走到A的第i个元素。然后维护一个dp表,dp[i][j]表示前i个里选了j个,拿到的最大得分。每次你可以选或者不选A[i-1],如果选了就用A[i-1]和B[j-1]配对得分。
我洗澡水都凉了,才捣鼓出下面这个玩意儿:
defmax_score(A, B):
n = len(B)
m = len(A)
dp = [[float('-inf')] * (n + 1) for _ in range(m + 1)]
dp[0][0] = 0
for i in range(1, m + 1):
for j in range(0, min(i, n) + 1):
# 不选当前A[i-1]
dp[i][j] = max(dp[i][j], dp[i-1][j])
# 选当前A[i-1],跟B[j-1]配
if j > 0:
dp[i][j] = max(dp[i][j], dp[i-1][j-1] + A[i-1] * B[j-1])
return dp[m][n]
你看这个代码啊,说白了就是枚举到第i个数,看选不选它,选的话更新一下状态。不选就把之前的结果抄过来。结果就是你dp[m][n]那个格子最大分数。
这个套路吧,其实跟咱小时候玩卡牌差不多,就是把手里最值钱的牌想办法和另一边最值钱的凑在一起。你非要说最优解,得一步步试,不能光图省事直接贪心。
-END-
我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领