这是一个好东西->作者主页
T1 联合权值
题目大意:在一棵树上选两个距离为
2
2
2的点相乘,让你计算这样的点对乘积之和以及最大值。
思路:
- 利用 F l o y d Floyd Floyd求出两点间距离,再暴力枚举两个点做乘积, 30 30 30分。
- 因为距离为
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 寻找道路
题目大意:给你一个图,让你在保证所有经过的点的出边都能直接或间接连向终点的情况下,使起点到终点的路程最短。
思路:
- 暴力枚举要走哪一个点,然后暴力判断, 30 30 30分。
- 记录每一个点的出边,用
b
f
s
bfs
bfs从终点开始遍历,遍历到一个点就将出边减一。
处理完后,用 s p f a spfa spfa跑最短路,将出边不是 0 0 0的点当做障碍即可。
注意几点,要处理重边和自环,搜索时标记边,当点没出现才加入队列。
T3 飞扬的小鸟
题目大意:给你一个游戏规则(缩写),让你判断是否能通关。如果能,输出
1
1
1和最少要点击屏幕的次数;如果不能,输出
0
0
0和最多能飞过的管道数。
思路:
- 设
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(fi−1,j−(xi−1×k),fi−1,j+yi−1),时间复杂度 O ( n m 2 ) O(nm^2) O(nm2)。 - 考虑完全背包思想。因为 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(fi−1,j−xi−1,fi−1,j+yi−1)。时间复杂度 O ( n m ) O(nm) O(nm)。
注意一点: j j j的枚举范围是 m + x i − 1 m+x_{i-1} m+xi−1
看不懂的点这里
完成情况
- T1
- T2
- T3