1、衢州市兴华中学 NOIP2017 普及组复赛 By 冯明浩 第 1页 / 共 3页 NOIP2017普及组复赛 -解题报告 衢州市兴华中学 By 冯明浩 Score 成绩 题目大意 给出三个整十数 A,B,C,求 A*20%+B*30%+C*50%的值 考察算法 模拟 算法一 直接粗暴地输出 A*0.2+B*0.3+C*0.5 时间复杂度: O(1) 期望得分: 100 算法二 由于分数均为整十数,先将分数各除以 10,再直接输 A*2+B*3+C*5。这样就避免了精度问题 时间复杂度: O(1) 期望得分: 100 librarian 图书管理员 题目大意 给出 N个数 Ai,再进行 Q次询
2、问,找后缀为给定数 Bi的最小的 Ai 考察算法 模拟 算法一 将 Ai及 Bi都转化成字符串。每次询问都对 N个数进行后缀比较,挑出个最小的 时间复杂度: O(N*Q*len) 期望得分: 80 算法二 对算法一的比较进行优化 构造出 n10 ,对于 Ai,直接 Ai Mod 10len,判断是否相等。这样每次比较的时间复杂度优至 O(1) 同时 先将 Ai排序,再每次从小到大查询,一旦找到就停 时间复杂度: 小于 O(N*Q)(一般情况) 期望得分: 100 算法 三 读入 Ai时进行处理,构造 ansx数组,记录询问 X的最小值。对于每个 Ai,依次取出其后 1、 2、 3 len位,修
3、正其的最小值。这样每次查询,就可以 O( 1)出结果了 时间复杂度: O(N*len) 空间复杂度: O(max(Bi) 期望得分: 100 Chess 棋盘 题目大意 给出一个 N*N的矩阵,其中部分格有颜色 每次可以从一个格向上下左右四个方向移动一格(不能越出矩阵且满足条件),根据两个格子的颜色有不同的代价 求从左上角走至右下角的最小代价 考察算法 最短路(动态规划) 算法一 直接暴力地按照题意进行 DFS 时间复杂度: O( nn*2 ) 期望得分: 30 算法二 以左上角为起点,右下角为终点,刷四个方向的 SPFA 衢州市兴华中学 NOIP2017 普及组复赛 By 冯明浩 第 2页
4、/ 共 3页 (也可预先对相邻格建好边,刷最短路 SPFA或 DIJ或进行记忆化 DFS) 时间复杂度: O(k*n*n) 期望得分: 100 Jump 跳房子 题目大意 给出 N个格子的位置 Xi与价值 Pi,从起点 0往右跳跃,初始跳跃的距离只能为 d 同时可以花费金币来调整其跳跃距离,花了 t 个金币时可跳跃的距离为max(1,d-t)(d+k) 每遍历一个格子就会获得其代价 Pi,求要获得总价值为 K所需最少的金币数 考察算法 二分、动态规划、单调序列(堆) 算法一 从小到大枚举所需金币数,用 O(N*N)的 DP进行 check,一旦发现可行就为答案 时间复杂度: O(max(Ai)
5、*N*N) 期望得分: 20 算法二 分析发现,枚举的金币数越多,跳跃范围越大,总价值一定越多 满足二分答案的单调性,于是将算法一的枚举答案变为二分枚举 时间复杂度: O()max(2log Xi *N*N) 期望得分: 50 算法三 分析一下 DP的转移方程: Fi=max(Fj)+Pi(max(1,d-t) ai-aj d+k) 就会发现 DP的 j这次循环是为了找 F1i-1中的最大值,自然而然就想到了用堆优化 堆中存放 F1i-1,若堆顶距当前 Xi大于 d+k,就丢掉该元素(再也没用) 否则若堆顶距当前 Xi小于 max(1,d-t),就暂存在临时数组中,最后在当前解更新好后记得塞回
6、去 则 Fi=Fheap1+Pi 时间复杂度: O()max(2log Xi *N*k* N2log ) 期望得分: 80 算法 四 继续优化算法三的 DP: 那些离当前 Xi太近的实际上完全没有必要塞入堆中,那么再另开一个变量 j 记录当前往堆中塞入的最后一个元素。每次将与当前 Xi的距离大于等于 max(1,d-t)的塞入堆中,只要检查一下堆顶是否太远即可,就保证了每个节点当且仅当入堆一次,时间复杂度中 k就消去了 时间复杂度: O()max(2log Xi *N* N2log ) 期望得分: 100 算法 五 在算法四的基础上再思考一下,其实也没有必要用堆了。因为 Xi是在不断增大,那么对于 Fx=Fy,显然距离起点远的更有用,即一旦 Fy进堆, Fx就没有存在的意义了( XxXy);若远的更大,则更不必说;小的话,就要暂留着,以备做前后的“中转站”。 这样的话,维护一个单调下降的单调序列来代替堆,每次将序列前面距离太远的干掉,后面再如上进行维护,每次抓序列的头就是前面的最优解: Fi=Fquehed+Pi 于是连堆的 N2log 也成功去掉了 衢州市兴华中学 NOIP2017 普及组复赛 By 冯明浩 第 3页 / 共 3页 时间复杂度: O()max(2log Xi *N) 期望得分: 100 另:除了上面的算法外,不排除还有其他更优的解法。