NOIP提高组历年试题狂做

来源:互联网 发布:英国研究生gpa算法 编辑:程序博客网 时间:2024/05/30 23:33

看着还有半个月就NOIP了,然而历年的NOIP题还很少做,赶紧补一补啊。

在网络上找到历年NOIP的全套题+评测真的不容易呀,强烈推荐Vijos!

因为我比较懒,就不贴代码了,主要讲一下做法。


NOIP 2005

篝火晚会

如果确定下了其中一个元素的对应位置,那么所有元素的对应位置都已经确定了。可以证明此时最小代价就是不在自己位置上(vii)的元素数量。
于是有一个想法就是枚举元素的对应位置。这样会T。

实际上只需要知道与自身目标位置差相同的元素数量最多是多少即可。因为总可以通过指定该元素来让它与目标差为0,即不需要置换它们。


NOIP 2008

双栈排序

我们判断一下什么情况是不可排序的。

记序列中的数的下标为i,值为 ai, 进入的栈是 cici = 1表示进入第一个栈, ci = 2表示进入第二个栈)

一个序列不可排序,当且仅当需要某个数 ax 弹出时,有大于ax的数压在栈 cxax 的上面,导致 ax 不可弹出。

形式化地,也就是存在 x<y<z, 且 az<ax<aycx=cy

其中数的下标是不可改变的,值也是不可改变的,而 ci(即进入的栈)是可以改变的。

于是我们只需要对于上述的每一个三元组(x,y,z)使cxcy即可排除这种情况。问题转化为二分图染色,判是否是二分图即可。


NOIP 2009

最优贸易

如果图是DAG,那么肯定有一个DP的做法。可以发现在一个强连通分量内只有值最小的和值最大的两个点可能有贡献,于是考虑缩强,对于每一个强连通分量记最大值和最小值,缩完之后就可以DP啦。


NOIP 2010

引水入城

可以发现第一行每个地方流出去的水在最后一行一定是一段连续区间,否则就一定不能完全覆盖。做最小线段覆盖即可。BFS或DFS的时候注意扫过的点的标记要打清楚!!!


NOIP 2011

选择客栈

应该有很多姿势,反正瞎扫一遍就好了。我是用后缀和+枚举中间点来做的。

Mayan游戏

码农模拟, 貌似我出了一组数据可以叉好多人超时?

计算系数

二项式定理

聪明的质检员

不难发现存在单调性,于是二分。用前缀和优化check。

观光公交

感性地想,每一个加速器一定要尽量放在人多经过的地方。发现一个性质:每个人的贡献=到达Bi的时间-出现的时间Ti,和什么时候上车没有关系。考虑在一条边上加速的贡献一定是一段连续区间,起点是这条边的终点,而区间的终点一定是等人的时间≥到达的时间的地方。于是可以对于每一个点算出它最长的贡献区间(即有多少个终点贡献会减少-1),然后前缀和维护人数。这样O(k*n)居然可过。


NOIP 2012

vigenere密码

应该是可以模拟搞出来的,但是我这个智障转成同余方程来做啦,反正能A。。。

国王游戏

刚开始考虑二分。对于一个二分的答案x,将每个人左手和右手乘起来,那么判定就是是否每个人的前面所有人(包括自己)的左手乘起来除以自己的右手小于等于x,然而这样复杂度会挂。经过观察可以发现按照每个人左右手乘积升序排序一定是最小的(假设不是升序,那么移动任意一对逆序对答案不会更差),然后就可以贪心而不用二分啦。

同余方程

exgcd 模板题

借教室

线段树常数小也许可以卡时通过?
如果处理第x个时教室数量出现负数,那么x以后肯定也存在负数,于是二分。就差分处理订单,最后扫一遍看有没有负数。

疫情控制

有一个重要性质:军队只有两种运动方式,要么不断往上走,要么往上走到根,然后越过根,进入另一个第二层的子节点停下来!

证明很显然,毕竟往下走一定不会比往上走覆盖得广。

然后二分答案。对于不能走到根的就一直往上,然后停下来。对于能走到根的进行分类,如果走到根就不能回到自己路径上的第二层子节点并且第二层子节点没覆盖,就直接让它停在第二层子节点。否则就先放在根。

然后对于所有放在根的军队按剩余时间排序,把所有第二层子节点按和根的距离排序,一一对应判断即可。


NOIP 2013

转圈游戏

第一眼以为是什么高精度LCM,仔细一看不就是快速幂吗。

火柴排队

这一篇比较长,因为有一些证明。。。

可以发现,当a,b中对应排名的数字放在一起时答案最小,即最小的放一起,第二小的放一起……(不难证明)。于是可以根据b数组对a数组的值重新编号,问题就转化为将a数组变为升序的最小操作次数,这里有两个结论。

结论一:如果只在a数组上操作,最小操作次数=逆序对数
证明:
1、每一次交换操作至多只会减少一对逆序对 ,这个是显然的
2、如果序列存在逆序对(即不是完全升序排列),一定存在一次操作能减少至少一个逆序对,这个可以用反证法
综上可以知道存在一系列操作使得每一次恰好减少一对逆序对,且这样是最快的,结论得证

结论二:如果在b数组上操作,那么每一次操作也至多减少一对a数组上的逆序对
证明:在b数组上操作只会交换a数组相邻两个值的下标,因为值是相邻的,因此肯定至多减少一对逆序对

结合两个结论可以知道不论在a数组操作还是在b数组操作都至多减少一对逆序对,所以可以全部都在a操作,即求出逆序对数,用树状数组即可

货车运输

容易发现货车走的一定是最大生成树上的边,于是把最大生成树建出来,然后倍增求树上路径min即可。

积木大赛

贪心即可,然而我用了单调栈,思路是一致的

花匠

可以得出O(n^2)的DP。如果把所有数字视作折线图,仔细观察就会发现最终答案一定是折线图上的谷和峰数量之和,DP即可得到优化。

华容道

指定棋子的移动一定要借助空白格子,因此可以以空白格子和指定棋子的相对位置建立状态,然后跑最短路即可。注意刚开始要先把空白格子移到棋子旁边。码农题。


0 0
原创粉丝点击