2010NOIP提高初赛问题求解第三题
题目
记 \(T\) 为一队列,初始时为空,现有 \(n\) 个总和不超过 \(32\) 的正整数依次入列.如果无论这些数具体为何值,都能找到一种出队的方式,使得存在某个时刻队列 \(T\) 中的数之和恰好为 \(9\) ,那么 \(n\) 的最小值是?
题解
解法好巧妙,考虑把分成的数记为 \(\{a_i\},i\in T\)(为方便起见,令 \(T=[1,n],S=[0,n]\),下同),记前 \(i\) 项的和为 \(b_i,i\in S\) 且 \(i>j\Leftrightarrow b_i>b_j,i,j\in S\),于是题目就相当于找两个 \(b_i.b_j\) 使得 \(b_i-b_j=9\)
由于 \(\sum_{i=1}^n a_i=32\) 所以 \(\forall i\in S,b_i\in[1,32]\)
至此 已经与 \(\{a\}\) 没有关系了 现在来看 \(\{b\}\),考虑把 \(1\to 32\) 每 \(9\) 项一列写出来:
0 9 18 27
1 10 19 28
2 11 20 29
3 12 21 30
4 13 22 31
5 14 23 32
6 15 24
7 16 25
8 17 26
对于第一行,若差都不为\(9\),\(\{b\}\) 中最多出现两个(\(1,19\)、\(1,28\)、\(10,28\) )
接着对下面每一行做一遍这个事情,就得到了:
若差都不为 \(9\),则最多选择的数为 \(2+2+2+2+2+2+2+2+2=18\)
但是由于前缀和算进了 \(0\),故差都不为 \(9\) 的情况下, \(\{a\}\) 中的数最多有 \(17\) 个
所以最小的 \(n\) 为 \(18\)
至此 解答就结束了
完了吗?
并没有 我们考虑上面的表,其实正是相当于 \(i\) 向 \(i+9\) 连边,最后求了一遍最大独立集
其实这种方法不难 \(\text O(1)\) 地拓展到任意的和来替换掉原题中的 \(32\) 与 \(9\),具体式子就不再赘述,读者可以自行计算。