7
30
2015
0

NOIP 2013 Day2 题解


这篇题解被手贱的我不小心删掉了,没办法,再打一次吧。


T1 积木大赛

这题的题意非常清楚,暴力$\mathcal{O}\left( nh\right)$的做法显然是不对的,可以用下面这个线性时间复杂度的做法:

每读入一列的高度,如果它比上一列高,就把答案递增两列高度之差,因为高出来的这些行必须用一个新的操作来填上,否则不用修改答案,因为这一列的每一行都可以由上一列延伸过来。

代码在此。


T2 花匠

这题思路和求LIS的思路非常相似。

维护两个序列,分别满足条件A和条件B,两者操作基本一致,我以条件A为例。

首先把第一株花的高度加入序列,然后枚举每一株花,这里要按序列长度的奇偶性讨论,操作也基本一致,我以奇数为例。

若高度小于序列的末尾元素,就把它加入到序列末尾,这样一定满足条件;否则就用该高度替换末尾元素,因为下一个元素要小于末尾元素,在不影响其他的前提下,末尾元素更大显然更优。

最后取较长的那个序列就行了。

代码在此。


T3 华容道

这题虽然实现起来代码较长,但思路还是很清晰的。

暴力BFS的时间复杂度高达$\mathcal{O}\left( n^4\right)$,再加上有多个询问,会TLE。考虑用最短路做。

求解每一个询问可以分为两步,先把空白块移动到目标棋子旁边,然后利用空白块把目标棋子移动到目标位置。

第一步BFS一遍就行了,第二步就有些麻烦。

设$f_{i,j,k}$为目标棋子在点$\left( i,j\right)$,空白块在目标棋子的k方向上这个状态。可以用各个$f$之间的转移构造出一张图,回答询问时在图上跑SPFA就行了。

代码在此。

Category: 题解 | Tags: NOIP | Read Count: 532

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter

Host by is-Programmer.com | Power by Chito 1.3.3 beta | Theme: Aeros 2.0 by TheBuckmaker.com