队列快照问题:队列快照是指在某一时刻队列中的元素组成的有序序列。例如,当元素 $1, 2, 3$ 入队,元素 $1$ 出队后,此刻的队列快照是 $\{2, 3\}$。当元素 $2, 3$ 也出队后,队列快照是 $\{\}$,即为空。
现有 $3$ 个正整数元素依次入队、出队。已知它们的和为 $8$,则共有( )种可能的不同的队列快照(不同队列的相同快照只计一次)。
例如,$\{5,1\}$,$\{4,2,2\}$,$\{\}$ 都是可能的队列快照;而 $\{7\}$ 不是可能的队列快照,因为剩下的 $2$ 个正整数的和不可能是 $1$。
这题其实是考‘正整数拆分’的组合计数。拿到题先想:三个正整数和为8,有多少种有序三元组?再想:每个三元组在入队、出队过程中会产生哪些不同的快照集合?最后把重复的集合去重,数一下总数。
容易把‘不同的队列’和‘不同的快照’混为一谈,以为有多少种三元组就有多少种快照;或者漏掉空队列这种特殊情况;还有人会忘记快照是有序序列,把{1,2}和{2,1}当成同一种,导致计数偏少。
考点:正整数拆分与组合计数;快照是队列中元素的有序序列,入队出队过程产生的快照集合要去重。
先求三个正整数和为8的有序三元组个数。相当于把8个相同小球分给3个不同盒子,每盒至少1个,用隔板法:C(8−1,3−1)=C(7,2)=21种。这21种三元组就是所有可能的‘初始队列’。
对每个三元组,模拟入队、出队过程:三个元素依次入队,得到快照{a,b,c};然后依次出队,得到{b,c}、{c}、{}。所以每个三元组最多产生4个快照:{a,b,c}、{b,c}、{c}、{}。
现在要统计这21个三元组产生的所有快照集合里,有多少个不同的有序序列。注意{}只出现一次,肯定计入。其余三个非空快照来自三元组的子序列:长度为3的只有{a,b,c}本身;长度为2的是{b,c};长度为1的是{c}。因此,不同快照的总数等于:
易错点:忘记c的范围是1..6而不是1..7,多算一个{7}(需要a+b=1,不可能),就会得到50;也有人把{c}和{b,c}混淆,或者把空队列漏掉。命题人喜欢在这里挖坑:看似简单的拆分,实则要细心枚举边界。
考频趋势:近五年海淀区信息学竞赛中,此类‘正整数拆分+组合计数’的单选题出现频率较高,约占总题量12%,且常与队列、栈等数据结构结合,考查对有序序列的理解。
预测:未来仍可能以‘拆分+快照/子序列’形式出现,或增加‘允许零’的变式,但核心仍是组合计数与去重。