2021.01.18【NOIP提高B组】总结

TOP

        • T1 联合权值
        • T2 寻找道路
        • T3 飞扬的小鸟
        • 完成情况

这是一个好东西->作者主页

T1 联合权值

题目大意:在一棵树上选两个距离为 2 2 2的点相乘,让你计算这样的点对乘积之和以及最大值。
思路:

  1. 利用 F l o y d Floyd Floyd求出两点间距离,再暴力枚举两个点做乘积, 30 30 30分。
  2. 因为距离为 2 2 2,所以可以先预处理出每个点的祖先以及它儿子的和、最大值以及次大值,
    然后 O ( n ) O(n) O(n)枚举每个点,计算它与它祖先的祖先的乘积以及它兄弟的乘积,
    与祖先的祖先的乘积要乘 2 2 2,因为我们不往下找。
    最后输出答案即可。不开 l o n g l o n g 70 longlong70 longlong70分,开了 100 100 100分。

T2 寻找道路

题目大意:给你一个图,让你在保证所有经过的点的出边都能直接或间接连向终点的情况下,使起点到终点的路程最短。
思路:

  1. 暴力枚举要走哪一个点,然后暴力判断, 30 30 30分。
  2. 记录每一个点的出边,用 b f s bfs bfs从终点开始遍历,遍历到一个点就将出边减一。
    处理完后,用 s p f a spfa spfa跑最短路,将出边不是 0 0 0的点当做障碍即可。
    注意几点,要处理重边和自环,搜索时标记边,当点没出现才加入队列。

T3 飞扬的小鸟

题目大意:给你一个游戏规则(缩写),让你判断是否能通关。如果能,输出 1 1 1和最少要点击屏幕的次数;如果不能,输出 0 0 0和最多能飞过的管道数。
思路:

  1. f i , j f_{i,j} fi,j表示到了第 i i i列,第 j j j行时,小鸟最多点击屏幕的次数。
    f i , j = m i n ( f i − 1 , j − ( x i − 1 × k ) , f i − 1 , j + y i − 1 ) f_{i,j}=min(f_{i-1,j-(x_{i-1}×k)},f_{i-1,j+y_{i-1}}) fi,j=min(fi1,j(xi1×k),fi1,j+yi1),时间复杂度 O ( n m 2 ) O(nm^2) O(nm2)
  2. 考虑完全背包思想。因为 j j j递增,所以可以省去枚举 k k k,用完全背包的方式更新值,即 f i , j = m i n ( f i − 1 , j − x i − 1 , f i − 1 , j + y i − 1 ) f_{i,j}=min(f_{i-1,j-x_{i-1}},f_{i-1,j+y_{i-1}}) fi,j=min(fi1,jxi1,fi1,j+yi1)。时间复杂度 O ( n m ) O(nm) O(nm)

注意一点: j j j的枚举范围是 m + x i − 1 m+x_{i-1} m+xi1

看不懂的点这里


完成情况

  • T1
  • T2
  • T3

你可能感兴趣的:(动态规划,最短路径专题)