2010NOIP提高初赛问题求解第三题

Posted on 2020-10-10 21:31  Choimoe  阅读(12)  评论(0编辑  收藏  举报

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\),具体式子就不再赘述,读者可以自行计算。