P14364 [CSP-S 2025] 员工招聘

这绝对是我这一年做过的简单做法最难理解的题。当然我很笨。

\(f(i,j,k)\) 为前 \(i\) 天,拒绝了 \(j\) 个人,在前 \(i\) 个位置内,有 \(k\) 个位置已经确定了具体选定的人,这些是在我们处理 \(c\le j\) 挑出来的。剩下的 \(i-k\) 个位置,虽然已经处理了它们是否被录取,但是具体人选还没确定。这个人选的选择最终直接 \(\times (n-k)!\) 就可以搞定。

换句话说 \(k\)\(1 \sim i\) 中在计数过程中被要求满足限制 \(c \le j\) 的位置个数。

\(s_{i+1}\) 分类讨论。

  • \(s_{i+1}=0\)。此时由于没人能做出来,所以只会有人被淘汰,跟 \(c \le j\) 没关系。所以 \(k\) 不变,\(j\) 加一。因此 \(f(i+1,j+1,k)\gets f(i,j,k)\)
  • \(s_{i+1}=1\)。此时只要耐心足够,就一定能被录取。即录取只跟耐心有关。
    • 先假定所有人都可以过。\(f(i+1,j,k) \gets f(i,j,k)\)
    • 然后考虑实际上让不让过。如果让过,那么这里就要求 \(c > j\),也就是任意 \(- [c\le j]\)。我们考虑 \(f(i+1,j,k+1) \gets f(i+1,j,k+1) - x\times f(i,j,k)\),其中 \(x\)\(\sum [c_i \le j] -k\),也就是可以填在这一位上且满足 \(c\le j\) 的人的个数。\(j\) 不变是因为我们这一轮实际上没有拒绝人。\(k\) 加一是因为我们容斥的时候要求 \(c \le j\)(当然这是不满足要求的,所以容斥系数是 \(-1\)),在之后同样要考虑,不能数重。
    • 如果不让过。那么 \(f(i+1,j+1,k+1) \gets f(i+1,j+1,k+1) + x\times f(i,j,k)\)

呃啊,真的好难。和 gpt 讨论了一下午,其中红温了若干次才弄懂。当然可能也有地方没讲懂。

posted @ 2026-08-25 17:02  wusixuan  阅读(12)  评论(0)    收藏  举报