第三十届ACM/ICPC 世界总决赛题目解析
斯坦福大学 王颖
本次比赛的题目请见http://icpc.baylor.edu/icpc/Finals/2006WorldFinalProblemSet.pdf
Problem A
本题的大意是,给出一些机票,每个机票都是一条路线,比如城市A->城市B->城市K->…->城市N,并且每张机票有一个价格。我们可以只用一张机票的一部分,比如城市A->城市B->城市K,然后就丢弃这张机票。但有两个条件,第一,必须在机票的起始城市才能使用机票,也就是说,我们不能用上面的机票从城市B到城市K;第二,如果使用了一张机票的部分,以后就不能使用剩下的部分。
现在给出一条路线,我们要按顺序访问一系列的城市。给出所有可以购买的机票,每种机票可以买无限张,问怎样可以用最少的花费完成整个旅途。
本题的数据规模颇小,机票最多20种,而每个机票最多经过10个城市。由于机票可以重复购买,城市必须按顺序经过,很容易想到要用动态规划。但从比赛过程中可以发现,无数的队伍被这题卡住了,而且很少的队伍能够一次通过。问题就在于,并不是只能访问指定路径上的城市,而是可以访问一些辅助的城市来减小花费。所以,我们要用一个二元组(i,j)来表示一个状态。其中i表示指定路径上已经按顺序访问了的城市数量,j表示当前所在城市。通过机票的信息,不难得到状态之间的一个有向图,而我们要求的其实就是一个最短路径。注意到这个图是有圈的,所以我们不能直接用动态规划,而是需要用最短路算法。本题初看觉得规模甚小,此时则可以发现最多能有20*10=200个城市,共可以有10*200=2000个状态,还是颇有规模的。
总结:想清楚后此题并不复杂。但比赛时必须保持头脑清醒,分析清楚题意,才可能顺利解决此题。比赛中虽然很多队伍做出此题,但很少有队伍一次做对,更有一些队伍一直困在这题,可见比赛中队伍普遍紧张,没能仔细的去考虑。
Problem B
典型的最小费用最大流,不多说了。二分图匹配也可以,但得到的图规模太大。
Problem C
物理题,恐怕还需要不少计算几何。比赛的时候没人做,我也没仔细看。
Problem D
题目大意:形如a…ab…b的数叫做bipartite number,比如1222,333999999,50,8888,1等等都是。给出一个数字x(x<=99999),求出x的最小的倍数n=kx(k>1),使得n是bipartite number。