NOIP2018(爆炸)总结

NOIP2018很愉快的爆炸了。于是让我们来快乐地写总结吧!

Day 1

T1 修路

惊现原题!!CCF我抄我自己!!!
这题应该做过NOIP2013 Day 2 T1的选手都AC了,然而我这只菜鸡显然没做过。所以我们从一个没做过这题的菜鸡的视角来看一下这道题:
首先,我们发现对于每一个区间,我们可以一次性这个区间填到不能填为止,然后将答案加上填充次数即可。这个填充次数显然是这个区间中的最小值,那么我们维护区间最值即可。直接一个线段树堆上去之后,我们遇到了一个大问题——我们没办法知道这个最小值在哪,所以我们得O(n)时间扫一遍!
果断TLE了。
正解是一种非常玄学的算法,每次读入一个数,将其与上一个数比较,如果比上一个深度更大,则将答案加上两个位置的高度差,搞定
(11-20补充:事实证明CCF的数据并没有想象中那么毒瘤,线段树很成功地卡过了所有数据点,愉快的AC了本题)

T2 货币系统

一道非常像数论的简单DP。
首先,我们对题目的数据进行分析,发现对于可以用该货币系统已有的货币表示出来的面值显然可以去除,因为该面值的货币不会令该系统能表示的货币增加或减少(它能表示出来的都能用别的表示出来),那么显然将其删去能令该货币系统面值的种数减少,所以我们只需求出有多少种面值能被该系统其他面值表示即可。
一种可行的做法是,对于每一种面值v_t的货币,取面值比它小的一种货币v_ik(k\in[1\sim\frac{v_t}{v_i}]),对v_t-v_i \ast k继续进行分拆,直至v_t=0\forall v_i>v_t为止。
然而这个算法显然是不够优秀的。这个算法的最坏时间复杂度为O(n^{2} \ast a),对于本题n \leq 100a_i \leq 1000的数据范围而言,还是十分危险的(虽说在i7-8700K上面卡过了)
优化!
可以发现,我们大多数的操作全都花费在了查找能被表示出的面额上面,有没有什么能够快速求出能否某个面额是否能表示出的方法呢?我们可以把每种面额的货币看做体积和价值都为其面值的物品,对于每一种面值,判断该容量的背包能取得的最大价值是否等于背包容量,若等于则将答案-1。注意选取的物品中不能包含该面值本身。(此处使用的抽象方法即为装满背包)
该算法时间复杂度为O(na),跑得飞快

T3 赛道修建

(果然我骗分功力还是不到家啊==)

Day 2

T1 旅行

题目要求的是字典序最小的旅行序列。我们发现,对于60%的数据,m=n-1,即该图是一棵树,那么,对于每一个点,访问之后就无法再次到达。这意味着每访问到一个节点,我们需要把它的子树走完,否则退回后其子树永远无法被访问到。显然,字典序最小的序列是按节点编号从小到大依次访问产生的(显然第一个访问的节点是编号为1的)。
接下来考虑对于全部数据,m=n-1m=n。当m=n时,该图为比树多一条边。那么我们考虑断一条边按m=n-1来处理。那么我们断哪一条边呢?random_shuffle();观察数据范围,n \leq 5000,显然我们可以使用n^{2}算法——枚举环上的每一条边,尝试断开,保存最小的序列。

总结

对于这次NOIP,说实话,我还是觉得没有尽到自己最大的努力,考场上的发挥也不是很好(比如线段树打错,暴力打挂,链表存图爆炸等等,导致调试花了很长时间),不过也因此发现了自己的很多问题。
接下来的一年内会加强DP的训练,学一些提高至省选的常用算法。
最后祈一个福,希望AH 275能蹭到省一吧==分数线280,痛失省一,明年再战!

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇