TCO13 Round 1A 题解

昨晚没起来……于是今天早上做了一下……


250pts:给定一个N*M的地图,每块有一个高度(0~9),现在要调整一些块的高度,使得整块地图中最高的块的高度与最低的块相差不超过1。将一块身高或降低一个单位的代价为1,求最小操作代价。

分析:高度只有0~9,直接枚举判断就好了……


500pts:一只青蛙要从数轴上的0跳到D,数轴上有N个不重叠的区间内部是不能进入的(端点可以),求一个最小的X,使得青蛙每次向前跳X个单位可以跳到≥D的位置,而且中途不会跳入任意区域。注意X可以是一个实数。D≤30000,N≤50。

分析:首先X肯定≥最长的区间长度。由于X要最小,那么一定会存在一个时刻青蛙跳到了某个区间的右端点。于是我们枚举这个区间,然后枚举到这个区间跳了几步,得到一个X。由于最长的区间长度≥1,所以步数不会超过D。然后我们对每个区间判断当前枚举的X是否合法,如果合法就更新答案。注意这题可能会存在精度问题……因为这个FST的可能有不少吧……


1000pts:给定一个N*M的地图,每块有一个上下左右的箭头,表示到了这一块要走到箭头所指的下一个格子。地图的上边界和下边界、左边界和右边界是联通的,即从左边出地图会到达右边,etc。如果从一个地图的任意一个格子出发,沿着箭头走可以回到出发的格子,那么称地图合法。求要修改至少几个格子的箭头才能使得地图合法。

分析:如果把地图的每一块抽象成节点,每个点向箭头指向的点连边,那么合法的地图应该对应一个每个连通块都是强连通分量的图。由于每个点只发出一条边,所以事实上每个连通块也都是一个环。也就是说,每个点应该发出一条边,同时连入一条边。

假设只要判断一个地图是否合法。我们可以建立一个网络流模型。把每个点拆成两个,一个代表出,一个代表入。从源向每个点的出节点连一条容量为1的边,从每个点的入节点向汇连一条容量为1的边,每个点的出节点向箭头所指的节点的入节点连一条容量为1的边。如果满流则合法。

现在考虑改方向。我们把网络流模型改成费用流模型。原网络流模型的所有边的费用都为0。每个点的出节点向非箭头所指的三个方向的节点的入节点连一条容量为1费用为1的边。答案即最小费用最大流。

你可能感兴趣的:(topcoder,topcoder)