画圆的沙滩

亦简亦美

2011年3月23日 #

有意义的电话号码

摘要: 编程之美的作者把3.2节的难度设定为三星,私下以为在二星左右。书中的解法二即最简版的深搜实现。而解法一实际是在枚举。事实上,这个问题十分类似于anagram问题。关于anagram问题,编程珠玑上有很细致的讨论。如果有兴趣的话,也可以尝试下面这道题:http://poj.org/problem?id=1002关于枚举的实现,我还是更喜欢实现一个类似于next_permutation的方法,然后用do...while循环来遍历。bool next_number(vector<int>& digits, const vector<int>& ranges) 阅读全文

posted @ 2011-03-23 20:41 acmaru 阅读(257) 评论(0) 推荐(0) 编辑

平面的切割

摘要: 这是一个有趣的问题。编程之美1.7节进行了探讨。其中解法二的思路非常巧妙。其用到的找逆序数算法是merge sort的变形,也很常见。最后的代码是这个算法的一份实现。这里则要从一个不同的角度来考虑这个问题。作者在分析分割的区域时,得到了这样的公式: F = N+M+1,其中N为直线数,M为交点数。作者的思路简明清晰。这里则要采用另外一个思路来给出这个公式。考虑著名的欧拉公式:F = E - V + 2。我们可以假想两条垂线在无穷远处重合,从而构成一个长轴是无穷大的椭圆区域,如下面的图所示。只考虑区域内的线段,再将区域外想象成为一个面,则整个图形构成一个压平的多面体。其顶点就是这些线条的交点,边 阅读全文

posted @ 2011-03-23 18:23 acmaru 阅读(301) 评论(0) 推荐(0) 编辑

区间覆盖

摘要: 编程之美2.19节,写了一份实现。对于扩展问题,可以使用一个平面四叉树来维护被覆盖的部分,对于每一个查询的矩形,在树中查询是否有空隙。这个过程同建树的过程中,插入一个新矩形是一致的。在建四叉树的时候,注意合并那些完全覆盖的子树成为叶节点。当然,我觉得用k-d树来维护覆盖信息也可以。template<class T>struct Interval { T a, b; bool operator<(const Interval& other) const { return a < other.a || a == other.a && b > o 阅读全文

posted @ 2011-03-23 15:44 acmaru 阅读(195) 评论(0) 推荐(0) 编辑

最短摘要与反转链表

摘要: 关于最短摘要,编程之美3.5节并没有给出详细的代码。其实还是值得一写的。下面的实现我使用了set和map来维护相关的信息。int main() { int n, m; while (cin>>n>>m) { // input vector<string> seq; while (n--) *back_inserter(seq) = *istream_iterator<string>(cin); set<string> kwords; while (m--) *inserter(kwords, kwords.end()) = *istr 阅读全文

posted @ 2011-03-23 11:34 acmaru 阅读(194) 评论(0) 推荐(0) 编辑

导航