二模 (15)day1

第一题:

题目大意:

有两个长度为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.

上一篇:2011年冬斯坦福大学公开课 iOS应用开发教程学习笔记(第三课)


下一篇:c# ffmpeg常用参数