员工举报调休,公司反手取消14天年假
刚看到个新闻,说深圳某厂员工举报9月27号调休,公司立马反手操作:以后只按国家法定放假,原本额外的14天年假直接取消 。
我觉得这事吧,说白了就是劳资博弈。员工觉得自己权益受侵害去举报,这是合法的;但公司用“削福利”来回应,虽然看着气人,其实也是在用规章制度保护自己利益。网友们的态度也挺两极,有人拍手叫好,说活该不团结;也有人觉得企业太小气,用员工福利来撒气。
在我看来,问题的根本是互不信任。员工怕被剥削,公司怕被“整顿”,最后大家两败俱伤。调休和年假,本来可以通过沟通解决,却被硬生生搞成对抗。说到底,职场不是角斗场,能坐下来谈,总比互相掐架强。【备注:文末可领最新资料】
算法题:力扣泡泡龙
昨晚十一点多,在公司楼下抽烟…有人在群里问“力扣泡泡龙咋做啊”,我脑子里嗡一声,这不就是那个像祖玛一样的——往一条彩球串里塞球,凑到≥3个同色就消、还能连锁,问最少用几颗手牌么。对吧,就是这个。
你手里有一堆球,比如"WRRBBW",桌面一串比如"RBYYBBRRB"。每次从手里挑一个颜色插到任意位置,插完立刻把“连续≥3”的块消掉,消完可能又形成新的≥3,再继续连锁。目标:最少步数把桌面清空;清不掉就返回-1。核心其实是搜索,但不瞎搜——要剪枝。
DFS+记忆化:状态是(桌面串board, 手牌计数handCount)。用
Map<String,Integer>记最优步数,避免重复。消块函数shrink:把board里所有“连续≥3”的块一口气消完,直到再也消不动;这玩意儿是连锁的灵魂。
投球剪枝:不要对每个位置都试。只在“颜色相同的段附近”插:
段长2,手里有1颗同色 → 一发入魂直接消; 段长1,手里至少2颗同色 → 两发补齐; 邻接同色( ...A|A...),有1颗A → 拼成3。 其它乱插大概率没意义,能不试就不试。再加一刀:某颜色手牌如果全程没用上或用完,别在别的分支重复试同样无效位置。
import java.util.*;
publicclassSolution{
publicintfindMinStep(String board, String hand){
int[] cnt = newint[26];
for (char c : hand.toCharArray()) cnt[c - 'A']++;
Map<String, Integer> memo = new HashMap<>();
int ans = dfs(shrink(board), cnt, memo);
return ans >= INF ? -1 : ans;
}
privatestaticfinalint INF = 1_000_000;
privateintdfs(String board, int[] cnt, Map<String, Integer> memo){
if (board.isEmpty()) return0;
String key = board + "#" + Arrays.toString(cnt);
if (memo.containsKey(key)) return memo.get(key);
int best = INF;
int n = board.length();
for (int i = 0; i < n; ) {
int j = i;
while (j < n && board.charAt(j) == board.charAt(i)) j++;
int run = j - i;
char color = board.charAt(i);
int need = Math.max(0, 3 - run); // 这段想消还差几颗
if (need <= 0) { // 已经>=3?shrink里会处理,这里跳过
i = j;
continue;
}
if (cnt[color - 'A'] >= need) {
// 尝试把这段补齐并消掉
cnt[color - 'A'] -= need;
String next = shrink(board.substring(0, i) + board.substring(j));
int sub = dfs(next, cnt, memo);
if (sub != INF) best = Math.min(best, sub + need);
cnt[color - 'A'] += need;
}
i = j;
}
memo.put(key, best);
return best;
}
// 连锁消除
private String shrink(String s){
StringBuilder sb = new StringBuilder(s);
boolean changed = true;
while (changed) {
changed = false;
for (int i = 0; i < sb.length(); ) {
int j = i + 1;
while (j < sb.length() && sb.charAt(j) == sb.charAt(i)) j++;
if (j - i >= 3) { // 消掉这段
sb.delete(i, j);
changed = true;
} else i = j;
}
}
return sb.toString();
}
}
就是那个…不要在每个索引都插一遍,会超时。锁定同色段去补才高效;再一个,记忆化的key里必须包含手牌计数,否则会把不同手牌的状态混为一谈。哦对,shrink要写成“循环消到稳态”,不然连锁断了,结果就不对。
行了我先去泡杯茶…等会儿谁要是跑不过,再喊我把“只在段边界试插一颗”的优化也加上去,能再快一截。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html