第一题:
题目大意:
有两个长度为N的序列A和B,在A和B中各任取一个数相加可以得到N2个和,求这N2个和中最小的N个。
解题过程:
1.这题是刘汝佳<<训练指南>>上的一道经典例题,考察了堆的运用.
如果把A,B序列都从小到大排序,那么有:
A1<=A2<=A3...<=An
B1<=B2<=B3...<=Bn
可以把这N2个和用N个递增队列表示出来:
A1+B1<=A1+B2<=A1+B3...<=A1+Bn
A2+B1<=A2+B2<=A2+B3...<=A2+Bn
...
An+B1<=An+B2<=An+B3...<=An+Bn
那么就可以用一个小根堆来维护了,一开始堆里的元素是A1+B1,A1+B2...A1+Bn
如果当前弹出的是Ax+By,那么把Ax+By+1 加入堆中。
初始得分100.
2.拓展:如果有N个队列,每个队列取一个数加起来(可以得到NN个和),求最小的N个和该如何做呢?
因为只要最小的N个,所以可以把队列两两合并。比如有3个队列A,B,C.可以在A,B中各拿一个数,得到最小的N个和,
形成一个新的队列,这样就变成上面2个队列的问题了。因此只要经过N-1次合并,最后的队列里的元素就是答案。
时间复杂度O(N2log2N)
第二题:
题目大意:
N个点,M条边,一开始人在S,每分钟后他都可能会到与当前城市直接相邻的城市.询问是否有某一个时刻这个人在所有城市都有可能出现。
解题过程:
1.首先自然想到如果图不是联通的,那么答案肯定是NO了,所以下面讨论的都是联通的情况。
2.正好jc的神模拟题里提到了二分图,就往二分图方面去想想,结果就发现如果这个图是二分图,那么答案也肯定是NO。因为任意时刻,人都是从二分图的一边走到另外一边。
3.二分图答案是NO,那么如果不是二分图,答案一定就是YES吗?画了下图,发现如果不是二分图,肯定是有奇环的,首先无论起点在哪里,肯定有一个时刻会走到环上,然后一定会有某个时刻环上的所有点都有可能。如果某个时刻环上的所有点都可能,那么之后的所有时刻环上的所有点都有可能。所以就有点类似flood-fill了,把环看成罪犯的老巢,然后罪犯的*只会慢慢往外扩大,最终占据所有城市。
4.存无向边的数组又忘记开2倍大了,就悲剧了。。初始得分40分。另外数据有点猛,用递归的并查集判断联通会爆栈说。
第三题:
题目大意:
求从S到T的一条路,要求花费最小且线路总长度不超过C。 一条路线的花费为它经过的点中最大的权值。
(边权和不超过C的情况下最大点权最小)
解题过程:
1.典型的最大值最小问题,可以二分答案mid,删去权值大于mid的点,然后做最短路,看能否到达。就拿来练习堆优化的dijkstra了。 初始得分100.