《挑战程序设计竞赛》题解 | shu_mj 的博客



《挑战程序设计竞赛》题解 | shu_mj 的博客

我决定把《挑战》的题目,从前到后刷,尽量每一道都给一些简短的解释!至于什么时间能全部完成,那就看造化了- -,也可能永远都完不成:|。

第二章

2.1

  • 1 / 1 Problem A POJ 2386 Lake Counting
    A 是例题啊,就直接 dfs 就好了,注意是 8 连块。
  • 1 / 1 Problem B POJ 1979 Red and Black
    B 就直接 dfs 数有多少个联通块。
  • 1 / 1 Problem C POJ 3009 Curling 2.0
    C 题算法也简单,可是实现麻烦。我是一步一步模拟的,并且用了"迭代深搜"。如果之前的搜索是可以最优化剪枝的,那直接每次设置最优解就好了,第一次找到的解就是最优的。直接 bfs 也是可行的,只不过需要记录整张图。迭代深搜看似好写,但是在深度过大时,可能会超时。
  • 1 / 2 Problem D POJ 3669 Meteor Shower
    这一题我看了 POJ 的 discuss,很多同学认为数据有问题,其实不然。数据是正确的,人的活动范围是第一象限,输入的坐标最多是 (300, 300),也就是最多会影响到 301,那么数组开到 303,就可以过了。
  • 1 / 1 Problem E POJ 2718 Smallest Difference
    后面几道题目都是枚举的了。这个直接全排列枚举,如果不符合数字规范就 continue 掉。直接认为前一半是一个数字,后一半是一个数字,这是贪心,可以证明。如果是奇数个数字,就认为前一半少一个数字,可以证明不丢失最优解。
  • 1 / 2 Problem F POJ 3187 Backward Digit Sums
    暴力枚举了,我发现下面一行的数字对原数组的使用其实跟组合数有关。所以我先算了一个组合数,然后全排列枚举原数组,对每个排列,O(n) 计算结果。我觉得这个是可以二分的,不深究了。
  • 1 / 1 Problem G POJ 3050 Hopscotch
    这题为什么我觉得是 DP 呢?反正我是 DP 解的,DP[i][j][k],表示在 (i, j) 位置,长度为的 k 的串的集合。 DP[i][j][k] = U{ DP[与 (i, j) 相邻][k - 1] }。最终答案为 U{ DP[ALL][6] } 的元素个数。

――以上结束于 2014 年 5 月 24 日上午 1:18

2.2

终于结束这一节了,贪心题真是太蛋疼了- -,说来又感到对高神真是无限膜拜啊 Orz。贪心对我来说,基本靠猜,而且猜的基本都是错的。

  • 1 / 2 Problem A POJ 3617 Best Cow Line
    这是书上的例题,每次可以取一列字母的最前面的或者最后面的,贪心策略是,如果前面的小,就拿前面的,后面的小就拿后面的。关键是如果相同怎么办?相同的话递归比较两个后继字母,到最后一直都相同,那就随便拿一个吧- -
  • 1 / 1 Problem B POJ 3069 Saruman's Army
    这个题是给定数轴上一些点,要求每个点都要有东西覆盖,你可以选择一些点,这些被选择的点就默认被覆盖了,而且它旁边 [-R, R] 的点也会被覆盖,问你最少应该选几个点?
    我算是用了一个偷懒的办法吧,我把所有的点都放到集合里面去了,然后每次拿出最前面的一个点,去看离他 [0, R] 范围有没有点,有的话就选最远的那个,并且把被选中的点右边 R 范围的点去掉。这一系列操作都可以调用 TreeSet 的接口,复杂度也不高。
  • 1 / 2 Problem C POJ 3253 Fence Repair
    这个题是告诉你,你现在需要很多根木棒,而你有一根长度恰为那些木棒的和的长木棒,现在让你把长木棒切割。每次切割的花费是这个木棒的长度,让你求最小木棒。
    这个题上来完全没想到怎么做嘛 - -,不过现在应该能想到了,因为像这种可以合并的问题大部分都是优先队列,后面还有好几道呢。之前想成了先和最小的,不对,先和最大的,也不对。正确的做法是按照哈夫曼树来合并。
  • 1 / 2 Problem D POJ 2376 Cleaning Shifts
    这题是最少区间覆盖问题,给你很多个区间,问你,现在如果要让你选择一些区间,使得一个新给定的区间被完全覆盖,最少应该选择的区间的数目是多少?
    之前区间覆盖问题一直不能解决,现在我应该是有一些想法了。如果你直接去看别人的代码,会很迷惑的,虽然代码不长,但是不好理解。而且这种区间贪心的代码,还有很多边界要处理- -,超级烦。不过现在我终于找到一个对我来说有效的办法了。
    那就是,先去包含区间。你发现,如果题目保证所有的区间互不包含,那么区间贪心的问题都很简单了。那现在如果我能去除包含区间,不就解决关键问题了吗?
    如何去除包含区间呢?一个简单的想法是平方枚举,但这显然 TLE,我看见别人给了一个(排序后)线性的解法,那就是让可能相互包含的区间放在一块,然后就好办了。如果你要小区间,就优先按右端点从小到大,然后按左端点从大到小排序;如果你要大区间,那就优先按左端点从小到大,然后按右端点从大到小排序。不知道你理解了没有?虽然这样代码很麻烦,但是复杂度跟别人的是一样的,想法容易实现。
  • 1 / 3 Problem E POJ 1328 Radar Installation
    这一题果断查题解了,开始想成了,从左到右贪心取每个点,但是正解是对每个点,可以算出一个区间,然后对区间做贪心就好了,区间的贪心又是经典的。
  • 1 / 2 Problem F POJ 3190 Stall Reservations
    经典的区间贪心问题。哦,不对,如果是只选择最多的独立区间,那就是经典问题,但是现在问题变了,所以我又去查题解了。经典的最多独立区间问题也可以按先去包含区间的做法来解。这一题是优先队列,搞不定啊- -。
  • 1 / 1 Problem G POJ 2393 Yogurt factory
    这一题是一个简单的贪心问题,对每天的奶酪,有两个选择,一是过往的最放到现在最便宜的奶酪,而是当前的奶酪。每次更新过往最便宜的奶酪就好了。
  • 1 / 2 Problem H POJ 1017 Packets
    这道题,记得很久以前做过。现在做,明显感到代码能力大增,虽然还是错了一次。就每次选择最大的放,然后放不满的话,就尽量填最大的 - -
  • 1 / 1 Problem I POJ 3040 Allowance
    神贪心,查题解的,理解不能。
  • 1 / 1 Problem J POJ 1862 Stripies
    这题瞎猜一发,按霍夫曼树的做法,然后样例跑不出来,按反霍夫曼的做法,对了- - ,这证明,我做贪心真的靠瞎猜 - -!
  • 1 / 2 Problem K POJ 3262 Protecting the Flowers
    最后一题也是瞎猜,考虑两头牛的情况,然后不假思索的推广到多头牛,然后排序,贪心处理 - -。

这一套贪心做的真是爽啊 T T。
――以上结束于 2014 年 5 月 28 日下午 6:35

2.3

  • 1 / 1 Problem A POJ 3176 Cow Bowling
    最基础的 dp 问题了
  • 1 / 1 Problem B POJ 2229 Sumsets
    给你一个 n(≤ 1e6),问你 n 的全部划分方案数,划分的数字里面只能含有 2 的幂。
    dp[i][j] := i 的 最大数 ≤ 2^j 的划分方案数目。
    dp[i][j] = dp[i][j - 1] + dp[i - 2^j][j]
  • 1 / 1 Problem C POJ 2385 Apple Catching
    每分钟掉一个苹果,可能掉在 1 树下面,也可能掉在 2 树下面,你最多可以移动 w 次,问你最多能接到多少个苹果。
    状态很明显了:
    dp[i][j] := 第 i 分钟已经移动 j 次时,能接到的最多苹果数目。
    转移也很简单,不写了。
  • 1 / 1 Problem D POJ 3616 Milking Time
    这道题跟以前的区间贪心问题类似,给你很多区间,问你最多能选出多少个互不重叠的区间。只不过现在每个区间有了一个权值,让你求最大的权值。我是直接线段树做的,状态是:
    dp[i] := 第 i 个位置没有被覆盖,能获得的最大权值。
    把所有区间按左端点从小到大排序,然后,对于每个区间,去跟新状态:
    dp[i] = max(dp[i], dp[l] + e) for each i >= r
    注意到整个 dp 数组在维护的过程中一定是单调增的,所以,可以二分出一个需要更新的区间,然后用线段树去在对数时间内更新掉。

    不过高神想到了一个更神的 - -,把区间离散化,f**k!

  • 1 / 1 Problem E POJ 3280 Cheapest Palindrome
    经典区间 dp:
    dp[i][j] := 从 i 到 j 区间内,更新到满足题意,需要的最小花费。
    dp[i][j] = { max(dp[i + 1][j] + e[i], dp[i][j - 1] + e[j]) if (A[i] != A[j])
    else dp[i + 1][j - 1]}
  • 1 / 2 Problem F POJ 1742 Coins
    这跟书上的一道例题很像,状态是一样的。
    先说题意,给你 n(≤ 100) 种货币,告诉你每种货币的币值(≤ 1e5) 以及数目(≤ 1000),问你在 1 到 m(≤ 100000) 中,有哪些价格是能用这些货币表示的。
    按照我以前的想法是这样的:
    dp[i][j] := 用前 i 个货币能不能拼出 j。
    这样的话,暴力更新复杂度就是 100 x 1000 x 100000,显然超了。
    现在把状态改成这样:
    dp[i][j] := 用前 i 种货币拼出 j,第 i 个货币还剩下的数目,为负表示不能用前 i 种货币拼出 j。
    仔细想一下,这个状态确实刚好是我们想要的。
    dp[i][j] = { c if dp[i - 1][j] >= 0
    else dp[i][j - a] - 1}
  • 1 / 2 Problem G POJ 3046 Ant Counting
    大致就是给你一个可重集,问你从这个集合的有 k 个元素的可重子集的数目,s ≤ k ≤ b.
    数据量不大,随便搞一个状态就好了:
    dp[i][j] := 前 i 种数组成的有 j 个元素的可重子集的数目。
    状态转移很简单,但是不好描述,具体等代码公开了,看代码吧 - -
  • 1 / 1 Problem H POJ 3181 Dollar Dayz
    n 用 1..k 来划分的划分数。
    dp[i][j] := i 用 1..j 划分的划分数。
    dp[i][j] = dp[i][j - 1] + dp[i][j - i]
  • 2 / 3 Problem I POJ 1065 Wooden Sticks
    这题相当于,在坐标轴上给你 n(≤ 5000) 个点,你可以连线,从一个点出发,你只能往右上连接下一个点,可以平着走也可以竖着走,问你最少连几个点能把所有的点都连上。
    以前做过所有的点的横坐标和纵坐标都不会相同的版本,直接求一个最长下降子序列就可以了,序列长度就是连线的条数。
    现在这个稍微麻烦一点,高神搞了一下,也是最长下降子序列,必须严格下降,才算下降,就是 x 和 y 都不能有相同的。
    不过没想到证明 - -
  • 1 / 1 Problem J POJ 1631 Bridging signals
    经典最长上升子序列
  • 1 / 1 Problem K POJ 3666 Making the Grade
    给你一个序列,A1, A2, ... An (Ai ≤ 1e9, n ≤ 2000), 现在让你生成另一个序列 B1, B2, ... Bn 是非降序列或者非增序列,使得花费最小,花费是 |A1 - B1| + |A2 - B2| + ... + |An - Bn|.
    易知 B 序列中的数字都是 A 序列中的数字(反过来不对),先只考虑非降序列,状态是:
    dp[i][j] := B 序列的第 i 个数 ≤ A 序列的第 j 小的数字时,当前的最小花费。
    dp[i][j] = min(dp[i][j - 1], dp[i - 1][j] + |Ai - A[P[j]]|)
  • 1 / 1 Problem L POJ 2392 Space Elevator
    给你 k(≤ 400) 个箱子,以及每个箱子的高度 h(100),数目 c(10),以及不能超过的海拔 a(40000),问你最多能堆出多高的高度。
    将箱子按 a 排序,算是一个贪心。
    然后对每个箱子,暴力更新这个状态就好了:
    dp[i] := 高度 i 是否能达到。
  • 1 / 2 Problem M POJ 2184 Cow Exhibition
    给你平面上的 n (100) 个点,以及坐标 x(-1000, 1000), y(-1000, 1000),让你选出一些点,使得 sum(x) + sum(y) 最大,但是要求 sum(x) ≥ 0 && sum(y) ≥ 0.
    我给了这样的状态:
    dp[i][j] := 前 i 个点,sum(x) = j 时,最大的 sum(y)。
    更新很简单了吧 - -

写了这么多,发现这样效率有点低下啊,还是得多刷题啊,以后尽量多刷题,少写博客吧 - -
以上完成于 2014 年 6 月 2 日下午 10:44

2.4
一些数据结构的简单题

  • 1 / 1 Problem A POJ 2431 Expedition
    可以发现,在走过的加油站中,在哪个地方加油是无所谓的,所以我们在油量最多的地方加油就好了。
    每走过一个站,如果油不够了,就试图在以前的加油站里加油。用优先队列维护。
  • 1 / 1 Problem B POJ 3253 Fence Repair
    这题,贪心模块里面也有,是哈夫曼树。
  • 1 / 2 Problem C POJ 1182 食物链
    经典的食物链,带权并查集,不推荐用《挑战》上面的方法,应该用维护到父亲距离的方法。
  • 1 / 2 Problem D POJ 3614 Sunscreen
    给你一些区间,和一些点,问你,如果每个点最多对应一个区间,最多能有多少个区间得到对应。
    包含区间中优先对应小的区间。
  • 1 / 5 Problem E POJ 2010 Moo University - Financial Aid
    这题应该还有简单的方法,我是 O(c log^2 c) 过的。二分答案,每次对数组排序。
  • 1 / 1 Problem F POJ 2236 Wireless Network
    简单建图后,就是普通并查集了。
  • 1 / 1 Problem G POJ 1703 Find them, Catch them
    一个简单的带权并查集。

带着考试的压力,水完了简单数据结构题。
因为,总是有比看书更有趣的事情可以做 - - !
最后完成于 2014 年 6 月 3 日下午 7:53

2.5

  • 1 / 2 Problem A POJ 3255 Roadblocks
    例题了,找次短路,对理解最短路算法很有帮助。
  • 1 / 1 Problem B POJ 3723 Conscription
    最小生成树,做这道题目突然感受到了最小生成树与最短路奇妙的联系 - - 因为我最开始当成最短路做了
  • 1 / 1 Problem C POJ 3169 Layout
    查分约束,例题。
  • 1 / 2 Problem D POJ 2139 Six Degrees of Cowvin Bacon
    floyd
  • 1 / 2 Problem E POJ 3259 Wormholes
    询问是否有负环。这题的数据里面,图都是联通的。
  • 1 / 1 Problem F POJ 3268 Silver Cow Party
    所有的点到 x,然后再回去的总路程最小是多少?
    是有向图,我突发奇想存了个反向图,做了两次 dij,就好了。
  • 1 / 2 Problem G POJ 1258 Agri-Net
    最小生成树
  • 1 / 2 Problem H POJ 2377 Bad Cowtractors
    最大生成树
  • 1 / 3 Problem I POJ 2395 Out of Hay
    找最小生成树的最大边 - -

于 2014 年 6 月 13 日下午 11:16
时间过得好快,没想到竟然是 10 天后我才完成图论这部分题目。最近都在准备考试 - -,其实也没有准备什么,我也不知道时间都跑哪去了。总之,后面要刷出节奏来 - - 不能再被其他事情耽搁了!

2.6

  • 1 / 1 Problem A UVA 10006 Carmichael Numbers
    按照公式来就可以了,不是素数而且满足费马小定理的式子,就是 Carmichael number。
  • 1 / 6 Problem B POJ 2429 GCD & LCM Inverse
    这道题超级坑,我一直 RE,在我写这个报告的时候都还没有用正统的方法通过它,被搞死了 - - 。
    后来看到岐哥以前的博客上面用 Java 水过了这道题目,利用 POJ 对 Java 多给的时限,用暴力的方法通过了。但是如果数据严格一点就没有办法了。
  • 1 / 1 Problem C POJ 1930 Dead Fraction
    这个题也巨恶心,不过挺实用的 - - ,用到一点数学知识,无限循环小数如何转化成分数。
  • 1 / 1 Problem D POJ 3126 Prime Path
    素数表 + bfs
  • 1 / 2 Problem E POJ 3421 X-factor Chains
    因式分解,求组合公式
  • 1 / 1 Problem F POJ 3292 Semi-prime H-numbers
    唉,这个题目好烦啊。后来查结题报告 加 乱水过的。 。 。
  • 1 / 1 Problem G POJ 3641 Pseudoprime numbers
    水题
  • 1 / 1 Problem H POJ 1995 Raising Modulo Numbers
    水题,快速幂一下就好了。

数学渣要被 B 题折磨哭了 - -
于 2014 年 6 月 16 日下午 10:33

第三章

3.1

  • 1 / 1 Problem A POJ 1064 Cable master
    经典的二分,先转换成整数搞。
  • 1 / 1 Problem B POJ 2456 Aggressive cows
    最小距离最大化
  • 1 / 1 Problem C POJ 3258 River Hopscotch
    大致是河上有一些石头,问你,拿走 M 个石头后,石头间的最小距离,最大可能为多少。
    虽然也是最小距离最大化,可是二分最小距离的时候,是否可行,却不是那么容易。
    虽然也是贪心,但是我只是查了题解照着写了写就过了 - - 。
  • 1 / 2 Problem D POJ 3273 Monthly Expense
    分组,让每组之和的最大值,最小。
  • 1 / 2 Problem E POJ 3104 Drying
    明显二分时间之后,判定变得很简单。
  • 1 / 4 Problem F POJ 3045 Cow Acrobats
    这个不是二分吧,反正我不会,查了题解是贪心,排个序就确定了。还有题意我也没有怎么读懂 - - 。
  • 1 / 2 Problem G POJ 2976 Dropping tests
    卧槽这道是个好题,书上的例题。需要小小的转化一下。
  • 1 / 1 Problem H POJ 3111 K Best
    同上一题。
  • 1 / 2 Problem I POJ 3579 Median
    这道题真是经典啊 - - ,二分答案,然后统计小于答案的数字的个数。
    这个统计可以在 O(n log n) 时间内完成。无非就是对每个数,二分在这个差值之内的数的个数,然后累加。
  • 1 / 3 Problem J POJ 3685 Matrix
    这个也好玩。观察发现这个矩阵每列都是单增的。于是对每行统计,统计的时候可以二分,也可以直接解方程。
  • 1 / 2 Problem K POJ 2010 Moo University - Financial Aid
    这个题以前好像做过一次,我又犯了同样的错误。每次判断的时候,只要 O(n) 就可以了。
  • 1 / 2 Problem L POJ 3662 Telephone Lines
    此题经典。问题可以这么描述:从 s 到 t 的路径,路上第 k 大的权值最小可能是多少?
    二分权值之后,就是让比答案大的路的数目最小。于是路上的权就变成了只有 0 和 1 的了。
  • 1 / 3 Problem M POJ 1759 Garland
    观察(写程序)可发现 B 的值与 A 右边的第一个值相关,可以二分。
  • 1 / 1 Problem N POJ 3484 Showstopper
    最后一题描述的好烦啊 - - ,好像只有一个数字出现了奇数次,让你找到这个数。
    这样说其实一点都不难了。

好棒的二分的题目:)
于 2014 年 6 月 18 日下午 7:06

3.2

这套题也不错,学到了几个小技巧:two pointer、折半枚举、开关灯……

  • 1 / 1 Problem A POJ 3320 Jessica's Reading Problem
    书上的例题,我用 map 乱搞的。。。
  • 1 / 2 Problem B POJ 3276 Face The Right Way
    暴力枚举翻转长度,每次枚举 O(n) 的到翻转次数。
  • 1 / 1 Problem C POJ 3279 Fliptile
    这个是开关灯的,要找最优解 - - 我本来还想用高斯消元试试的,但是想想好麻烦啊,放弃了 - - 。
  • 1 / 1 Problem D POJ 3684 Physics Experiment
    物理题 - - 好无聊啊 - - 我没有解公式,直接抄书上的 - - 。
  • 1 / 1 Problem E POJ 2785 4 Values whose Sum is 0
    折半枚举,很棒 :)
  • 1 / 2 Problem F POJ 2566 Bound Found
    这里我才感受到 two pointer 的强大 - -,简单来说,就是刘汝佳说的"窗口"的概念,就是说两个指针之内的元素形成了一个窗口,这个窗口的最优解要能得到,而且能在移动两个指针的时候,方便维护。而且能证明最优解一定出现在两个指针移动的过程中,这是一个贪心 - - 。
  • 1 / 2 Problem G POJ 2739 Sum of Consecutive Prime Numbers
    这道就稍微简单一点了,也是 two pointer
  • 1 / 1 Problem H POJ 2100 Graveyard Design
    同上
  • 1 / 1 Problem I POJ 3185 The Water Bowls
    这个我直接两面都搞了一次,求了一个最小值。
  • 1 / 1 Problem J POJ 1222 EXTENDED LIGHTS OUT
    这道题我现在已经可以写得很快了,10 分钟左右。以前沈老师出这道题的时候我还没有一点思路呢 - - 真是弱啊 - - 。
  • 1 / 1 Problem K POJ 2674 Linear world
    这道题我算是做得很简洁的了,跟网上其他的代码比较。首先可以算出最后一个掉落的时间。然后不考虑碰撞,不考虑掉落,看每一个蚂蚁能到达什么位置,记录到数组中。把这个数组排序,刚好在边缘的那个数的下标就是输入的蚂蚁的下标。
  • 1 / 1 Problem L POJ 3977 Subset
    艹 这竟然是没有多项式解法的题 - - ,关键是 discuss 里面有人说他一眼就看出来了。 。 。 折半枚举 - -
  • 1 / 7 Problem M POJ 2549 Sumsets
    也是折半枚举 - -

这套题中间简短了一下,因为有课要上 - - 。现在熬夜把它搞完了 - - 挺不错的题目。
刷题一定要连贯,断断续续没有长进啊 - - 。

于 2014 年 6 月 22 日上午 1:18

3.3

  • 1 / 1 Problem A POJ 2991 Crane
    书上的例题,我不会做,只能抄一遍代码 - -
  • 1 / 1 Problem B POJ 3468 A Simple Problem with Integers
    这个,学线段树的人应该都做过吧 - -
  • 1 / 3 Problem C POJ 2104 K-th Number
    这次竟然用分块过掉了 - - 以前不知道怎么的都过不掉的啊。归并树也可以过掉。
  • 1 / 2 Problem D POJ 1990 MooFest
    这个大概是让你统计一个值,然后这个值,如果你真的暴力统计的话,是会超时的。
    于是就可以每次统计多个,复杂度就降下来了。
  • 1 / 1 Problem E POJ 3109 Inner Vertices
    竟然是扫描线 - - 好难啊 - - 其实也不是很难,还是可以做的。
  • 1 / 2 Problem F POJ 2155 Matrix
    楼教的题目,做过很多次了。直接二维 BIT 就可以了。
  • 1 / 1 Problem G POJ 2886 Who Gets the Most Candies?
    这道题,让我终于发现我的 BIT 里面的一个函数是用来干什么的了。
    当然如果没有那个函数,也是可以做的,只不过复杂度得乘上一个 log n,因为需要二分。
  • 1 / 1 Problem H POJ 3264 Balanced Lineup
    RMQ 裸题
  • 1 / 1 Problem I POJ 3368 Frequent values
    LRJ 给了 RMQ 的做法,不过我还是用更直接的线段树过掉了。
  • 1 / 1 Problem J POJ 3470 Walls
    这道题有点难,题目中也没有说明坐标的范围,看来应该很大,快到达 int 的最大值了。
    也是扫描线做的。
  • 1 / 1 Problem K POJ 1201 Intervals
    这个贪心就好,只不过要用 BIT 来维护信息。
  • 1 / 1 Problem L UVA 11990 ``Dynamic'' Inversion
    分桶法,外加一个二维 BIT

这套题目还是做得很快的,但是还是过了这么长时间,因为中间有点小插曲,VJ 挂了一次,所以我就出题去了。

于 2014 年 6 月 24 日下午 9:54

3.4

  • 1 / 1 Problem A POJ 2686 Traveling by Stagecoach
    例题,状压 dp
  • 1 / 1 Problem B POJ 3734 Blocks
    例题,矩阵
  • 1 / 1 Problem C POJ 3233 Matrix Power Series
    裸的矩阵优化,就是写成来有点麻烦 - -
  • 1 / 1 Problem D POJ 1769 Minimizing maximizer
    也是例题,注意到每个组件的顺序不能改变就好做了。
  • 1 / 1 Problem E POJ 2441 Arrange the Bulls
    状压 dp,这后面的状压 dp 一般不难,除了插头 dp。。。
  • 1 / 1 Problem F POJ 3254 Corn Fields
    同上。
  • 1 / 5 Problem G POJ 2836 Rectangular Covering
    这个题很无语啊 - - ,很多网上的题解都是错的,但是却能 AC - - 我瞎抄了一份 - -
  • 1 / 1 Problem H POJ 1795 DNA Laboratory
    这个题好难啊 - - 不知道为什么我都排序了,还是出不了字典序最小的解,非要再去 dfs 一次才行 - - 而且裸的 dfs 还不行,TLE,还要回溯剪枝 - -
  • 1 / 1 Problem I POJ 3411 Paid Roads
    这个题把经过的点集也看做状态,就可以了。
  • 1 / 1 Problem J POJ 3420 Quad Tiling
    这就是传说中的插头 dp 的基础版本 - - 卧槽,太难了 - - ,《挑战》上面也没有好好讲他的状态表示,导致我完全看不懂他的代码,只能按照网上的做法解了 - - 。
  • 1 / 2 Problem K POJ 3735 Training little cats
    做过一次类似的,前面就简单的矩阵乘法,因为每一次操作,就相当于乘了一个特殊的矩阵。
    后面直接矩阵快速幂就好了。但是会 TLE,看 discuss,要稀疏矩阵优化 - -
  • 1 / 1 Problem L POJ 3171 Cleaning Shifts
    这个我就直接线段树加个二分搞了一下 - -

这套题目做的好慢啊 - - 距离上次已经有 3 天了,而且我也没有什么其他的事情,基本就是这些题目了 - - 。
还是题目难度加大了 - - 已经有点吃力了 - -
不过后面终于到了网络流了 - - ,看到曙光了有木有:)
于 2014 年 6 月 27 日下午 4:52

3.5

  • 1 / 1 Problem A POJ 3041 Asteroids
    二分图的例题
  • 1 / 3 Problem B POJ 3057 Evacuation
    二分图,现在我应该能独立解出这道题了吧~
  • 1 / 1 Problem C POJ 3281 Dining
    好像是最大流
  • 1 / 2 Problem D POJ 3469 Dual Core CPU
    最小割,分成两个集合(s-t 割)
  • 1 / 1 Problem E POJ 2135 Farm Tour
    最小费用流(两条不同的最短路)
  • 1 / 4 Problem F POJ 2175 Evacuation Plan
    这道题神烦,直接费用流还会超。得消负圈。不过对于了解最小费用流的原理还是挺有帮助的~
  • 1 / 1 Problem G POJ 3686 The Windy's
    这道题神难~ 不知道现在会不会~
  • 1 / 1 Problem H POJ 3680 Intervals
    好题,让我对最短路建模有了更深的理解
  • 1 / 1 Problem I POJ 3713 Transferring Sylla
    这题也是神烦,问是否 3 联通。不知道怎么跟网络流联系在一块,看了题解是枚举去掉一个点,然后看是否双连通。
  • 1 / 1 Problem J POJ 2987 Firing
    最大权闭合图。感觉是很一般性的问题,但是论文和原理我都搞不大懂,现在只能记住结论啊。
  • 1 / 1 Problem K POJ 2914 Minimum Cut
    全局最小割,感觉也是一般性问题,只能搞专门算法,不知道怎么放到网络流里面~
  • 1 / 1 Problem L POJ 3155 Hard Life
    有人说,题如其名~ 求最大密度子图。论文里面本来有一个是转化成最大权闭合图问题的方法,但是我看不懂啊~后来直接读了建图水过了,这道题我不会T.T
  • 1 / 2 Problem M POJ 1274 The Perfect Stall
    水二分图。后面几道好像都是的。
  • 1 / 3 Problem N POJ 2112 Optimal Milking
    二分图之前还要 floyd。。。
  • 1 / 2 Problem O POJ 1486 Sorting Slides
    神烦 二分图。
  • 1 / 2 Problem P POJ 1466 Girls and Boys
    数据格式有问题。简单题。
  • 1 / 1 Problem Q POJ 3692 Kindergarten
    二分图最大团。取补图转化成最小点覆盖。
  • 1 / 1 Problem R POJ 2724 Purifying Machine
    好高兴,终于有一个自己想出来 AC 的。不过我还没有证明它是 二分图。
  • 1 / 2 Problem S POJ 2226 Muddy Fields
    经典的建图。需要先扫描把一个团变成一个点。
  • 1 / 1 Problem T POJ 3068 "Shortest" pair of paths
    经典最小费用流建图。
  • 1 / 1 Problem U POJ 2195 Going Home
    同上。
  • 1 / 1 Problem V POJ 3422 Kaka's Matrix Travels
    艹 这道题好经典啊~

网络流搞了 20 多天,真是破纪录了,以前都是一般 两三天搞一节的,现在直接翻了 10 倍~~~
还有两天不到题目时间就结束了~下面的计算几何能不能搞完呢~~~

3.6

  • 1 / 1 Problem A POJ 1127 Jack Straws
    例题,判线段相交
  • 1 / 2 Problem B POJ 2932 Coneology
    例题,还有点不懂。。。
  • 1 / 1 Problem C POJ 2187 Beauty Contest
    最远点对,凸包然后旋转卡壳
  • 1 / 1 Problem D POJ 1981 Circle and Points
    单位圆最多能覆盖多少点。考虑极限情况,肯定有一个点在单位圆的圆周上。那么对于那个在圆周上的点,我们思考圆心应该在哪?圆心肯定在以这个点做单位圆的圆周上。我们考虑在这个圆周上选点作为圆心,最多能覆盖多少点。以其他点做圆心画单位圆跟这个圆周相交,把这个圆周分成了很多弧,对每个弧单独考虑就行了。
  • 1 / 1 Problem E POJ 1418 Viva Confetti
    按顺序放一些圆盘到平面上,问你从上往下看,能看到几个圆。考虑你会在什么地方看到圆。很多圆相交的圆弧上往外(远离这个圆弧圆心方向)或往里一点距离的点,枚举这些点就可以了。
  • 1 / 1 Problem F POJ 3168 Barn Expansion
    这个可以用扫描线简单水过。
  • 1 / 1 Problem G POJ 3293 Rectilinear polygon
    这个有点麻烦,解法感觉需要证明。不太会。
  • 1 / 1 Problem H POJ 2482 Stars in Your Window
    扫描线。不算难题。
  • 1 / 1 Problem I POJ 1113 Wall
    简单凸包。
  • 2 / 4 Problem J POJ 1912 A highway and the seven dwarfs
    问你是否所有的点都在直线的一侧。可以先做一个凸包,问你等价于这个凸包在直线的一侧。
    直线与凸包的交点是可以二分的。但是我太渣了写不出来。。。
    然后考虑凸包上的线段的角度是(可以做成)递增的。而且可以知道如果这条直线跟凸包相交,等价于凸包上一定有两个(距离最远的)点连的线段跟这条直线相交。而这两个点是可以利用角度特征二分查找出来的,所以只需要判断这两个点就行了。
  • 1 / 2 Problem K POJ 3608 Bridge Across Islands
    凸多边形的距离。搞成点到凸多边形的距离。然后套的模板(log n)
  • 1 / 1 Problem L POJ 2079 Triangle
    最大面积三角形。可以知道三角形的点一定在凸包上。然后平方枚举一条边来搞。网上的线性解法似乎不太对,过不了我自己的随机数据,虽然能AC。
  • 1 / 2 Problem M POJ 3246 Game
    n 个点里面,选出 n - 1 个点,使得这 n - 1 个点搞成的凸包面积最小。
    去掉的那个点一定是 n 个点的凸包上的点。用角度扫描法,去掉一个点后,去掉的这个点旁边的点拿出来再搞一次(小范围的)凸包。总复杂度还是 n log n。
  • Problem N POJ 3689 Equations
    这道题还不会,看以看 yygy 的解法

最近刷题太松散了。
最后完成于 2014 年 8 月 19 日上午 12:47


Read full article from 《挑战程序设计竞赛》题解 | shu_mj 的博客


No comments:

Post a Comment

Labels

Algorithm (219) Lucene (130) LeetCode (97) Database (36) Data Structure (33) text mining (28) Solr (27) java (27) Mathematical Algorithm (26) Difficult Algorithm (25) Logic Thinking (23) Puzzles (23) Bit Algorithms (22) Math (21) List (20) Dynamic Programming (19) Linux (19) Tree (18) Machine Learning (15) EPI (11) Queue (11) Smart Algorithm (11) Operating System (9) Java Basic (8) Recursive Algorithm (8) Stack (8) Eclipse (7) Scala (7) Tika (7) J2EE (6) Monitoring (6) Trie (6) Concurrency (5) Geometry Algorithm (5) Greedy Algorithm (5) Mahout (5) MySQL (5) xpost (5) C (4) Interview (4) Vi (4) regular expression (4) to-do (4) C++ (3) Chrome (3) Divide and Conquer (3) Graph Algorithm (3) Permutation (3) Powershell (3) Random (3) Segment Tree (3) UIMA (3) Union-Find (3) Video (3) Virtualization (3) Windows (3) XML (3) Advanced Data Structure (2) Android (2) Bash (2) Classic Algorithm (2) Debugging (2) Design Pattern (2) Google (2) Hadoop (2) Java Collections (2) Markov Chains (2) Probabilities (2) Shell (2) Site (2) Web Development (2) Workplace (2) angularjs (2) .Net (1) Amazon Interview (1) Android Studio (1) Array (1) Boilerpipe (1) Book Notes (1) ChromeOS (1) Chromebook (1) Codility (1) Desgin (1) Design (1) Divide and Conqure (1) GAE (1) Google Interview (1) Great Stuff (1) Hash (1) High Tech Companies (1) Improving (1) LifeTips (1) Maven (1) Network (1) Performance (1) Programming (1) Resources (1) Sampling (1) Sed (1) Smart Thinking (1) Sort (1) Spark (1) Stanford NLP (1) System Design (1) Trove (1) VIP (1) tools (1)

Popular Posts