![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
第八章 - 高效算法设计
文章平均质量分 75
专攻挖掘机炒鸡蛋算法
Hahahahaha!
展开
-
UVa #11134 Fabled Rooks (例题8-4)
书中的提示很有帮助,将这道题拆成两个一维空间分开进行判断,那么就变成了贪心法的区间重叠问题设车的摆放位置为 [a,b]。我的算法是,将所有的区间按照 b 的值从小到大排列,b相同的按照 a 从小到大排列。然后从排好序的第一个区间(即a、b最小)开始选择摆放位置。选摆放位置的时候,从左向右扫描,一旦有某一列暂时空着(没有其他的车摆在这一列),则马上摆放在这里,然后继续摆下一个原创 2015-01-26 21:19:18 · 565 阅读 · 0 评论 -
UVa #1612 Guess (习题8-8)
因为一共只有三道题,所以每个人的得分最多有8种可能性。把这8种可能性都算出来,存在数组里,排好序备用排名就是一个天然的链表,给出了扫描的顺序扫描时,维护两个变量:前一个player的最大得分 recd 和他的ID recdID扫描到每个player时,从大到小遍历他的8种得分,如果有等于recd的得分,且这个player的ID大于recdID,则只需更新recd原创 2015-02-04 18:38:31 · 891 阅读 · 0 评论 -
UVa #11491 Erasing and Winning (习题8-4)
#define UVa "8-4.11491.cpp"char fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#includeusing namespace std;//Global Variables. Reset upon Each Case!const int maxn = 100000 + 1原创 2015-02-06 18:33:16 · 835 阅读 · 0 评论 -
UVa #10570 Meeting with Aliens (习题8-13)
#define UVa "8-12.10570.cpp" //Meeting with Aliens.char fileIn[30] = UVa, fileOut[30] = UVa;#include#include#includeusing namespace std;//Global Variables. Reset upon Each Case!const int ma原创 2015-02-06 18:34:51 · 594 阅读 · 0 评论 -
UVa #1614 Hell on the Markets (习题8-10)
因为 1 所以只需排序后从最大的元素(假设为k)开始,凑出sum/2即可。用去掉了k的集合,一定可以凑出sum/2 - a[k],所以不用担心贪心到最后凑不出来。只要sum是偶数,就一定会有解。Run Time: 0.339s#define UVa "8-10.1614.cpp" //Hell on the Marketschar fileIn[30] = UVa原创 2015-02-09 15:48:52 · 1324 阅读 · 2 评论 -
UVa #11925 Generating Permutations (习题8-7)
感觉把题目要求的过程反过来做会比较简单:把一个乱序的序列排成升序做着做着觉得其实就是冒泡排序的改版嘛。如果最前面两个数不满足a复杂度大概是O(n^2),还没有超过2*n^2的要求。Run Time: 0.192s#define UVa "8-7.11925.cpp" //Generating Permutationschar fileIn[30]原创 2015-02-04 18:06:54 · 1747 阅读 · 0 评论 -
UVa #11536 Smallest Sub-Array (习题8-17)
理解题目:有一些不同颜色的散点分布在整数数轴上,找出一条线段,使得线段内拥有所有颜色的点一开始觉得有点像是区间覆盖问题,但是这里的散点和区间的性质有些不同,似乎无法使用贪心法然后考虑,题目的描述有点像滑动窗口,故尝试滑动窗口+二分查找找出窗口大小的最小值运行时间是有惊无险的7s,由于要求的是8s,所以我的算法是一半TLE一半AC。等复习白书的时候再回过头来优化这原创 2015-02-11 17:23:48 · 586 阅读 · 0 评论 -
UVa #120 Stacks of Flapjacks (例题8-1)
第八章真是严肃活泼的算法设计试着读原题真是跪了,就是个摊煎饼问题却要扯一大堆有的没的算法还是挺好想的,先把最大的翻到最上面,再连锅翻过来,最大的就到最底下了。之后就可以不用管这个煎饼了。不过对于当前最大煎饼的位置要分类讨论:如果已经在最底下就什么也不做,如果已经在最顶上就直接连锅翻,如果在中间则需要按照上面的方法翻两次。Run Time: 0.012原创 2015-01-23 11:03:57 · 645 阅读 · 0 评论 -
UVa #1153 Keep the Customer Satisfied (习题8-12)
太担心于算法的正确性,一不留神被输出的空行要求坑了。凡是只给一组sample的,都应该首先留意输出格式的文字要求另外,题目的"before its due date"也是坑啊,加一个"or on"会怀孕么Run Time: 0.399s#define UVa "8-12.1153.cpp" //Keep the Customer Satisfiedchar原创 2015-02-10 16:46:56 · 576 阅读 · 0 评论 -
UVa #1615 Highway (习题8-11)
Run Time: 0.028s#define UVa "8-11.1615.cpp" //1615 - Highwaychar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#includeusing namespace std;//Global Variables. Rese原创 2015-02-09 17:36:24 · 1002 阅读 · 0 评论 -
UVa #1152 4 Values whose Sum is 0 (例题8-3)
这道题虽说不难但是还是摩擦了半天。另外例题8-2感觉很神奇,就不放代码了网上不少人用了数组排序的方法,也有自己实现hash_map的方法。我用了哈希,主要是为了练习练习自己写哈希要注意一些对性能会造成影响的部位:1、vectorvector中的元素多了之后,push_back的速度非常非常慢。数据量大的时候要避免vector2、memset在原创 2015-01-23 17:54:31 · 803 阅读 · 0 评论 -
UVa #1611 Crane (习题8-6)
是不是很像摊煎饼那道例题,唯一的区别是这次是从中间开始交换左右两边的元素,而两边各自元素的顺序不变。因此尝试每次将一个元素摆到正确的位置。尝试后发现,(稍微分奇偶讨论下)每个元素最多用两次就可以归位,所以复杂度最坏情况下是O(2n)像其他需要交换元素位置的题目一样,这道题也需要注意一下边界。另外起始位置是0还是1也要小心。其他的就没有特别的了Run Time:原创 2015-02-04 18:00:38 · 748 阅读 · 0 评论 -
UVa #12545 Bits Equalizer (习题8-3)
个人感觉突破点是0可以换成1,而1不能换成0。所以想到应该优先满足1-0(上1下0)的情况。而其它三种情况都只用简单变换就可以满足配对。用0-1来进行swap显然是最快的,同时可以满足两组配对。如果没有0-1了,那么可以用?-1。先换成0-1再swap。如果两种都没有了,说明无解,因为下面的1是变不出来的,而我们现在还有上面的1未能配对。把上面的1成功配对后,其他的原创 2015-02-04 17:21:33 · 805 阅读 · 0 评论 -
UVa #1610 Party Games (习题8-2)
确实像书中所提醒的,需要仔细考虑各种情况下的可能性。分类讨论的时候按照一定的规律来,可以降低遗漏的几率我们只需要判断所有名字排序后中间的两条就可以了有一种暴力的方法:从第一个位置开始判断,如果对应位置上的字符不同且未到达末尾,则在这个位置上枚举A-Z。只要满足 s1 如果到达了s2的末尾,则在s1的下一个位置上枚举如果到达了s1的末尾,则 ans = s1暴力法原创 2015-02-04 17:09:06 · 604 阅读 · 0 评论 -
UVa #1607 Gates (例题8-14)
完全没意料到的AC啊。。这么顺利。。最近人品爆发Rujia的分析以及分析的方法值得仔细学习。。对于题目,考虑一下不同输入会出现的情况,分类、归纳,找到临界处,简化问题这道题把四种可能的情况列出,规律就是输出是常数0、1,x和!x中的一个。如果是常数,则输入可以任意。如果是x或!x,那么 x 等于 0 或 1 时的输出不同,所以从 00...00 开始,逐位改为 1 ,直原创 2015-01-27 17:56:53 · 735 阅读 · 0 评论 -
UVa #12174 Shuffle (例题8-15)
连续子序列。。又是滑动窗口哈这道题用滑动窗口做的话,无非就是枚举第一个窗口的起始位置,从 -s+1 到 0。(用负数表示开头的不完整周期) 然后判断每个窗口是不是都符合没有重复数字的要求这道题和之前的滑动窗口不太一样,这道题要简单些:窗口的大小是固定的。我们只需要把每个元素的前一个出现位置记下来,在滑动窗口进行判断的时候,挨个看每个元素的上一次/下一次出现位置有没有在窗口范原创 2015-01-27 11:10:33 · 822 阅读 · 0 评论 -
UVa #12627 Erratic Expansion (例题8-12)
像这样的明显2^k的数据,我觉得应该直接反应出递归分治法。对于具体如何做这个D&C,Rujia给的思路真是很赞,非常值得学习。通过仔细的观察和分析,会发现这些气球有个特点:上半部分的左半边和右半边,以及下半部分的左半边,都全等于前一个时刻的状态。下半部分的右半边则全部是蓝气球,不予考虑因此,我们只需要将[A,B] 这个区间分成两部分来看:中线以上的部分和中线以下原创 2015-01-27 10:41:44 · 738 阅读 · 0 评论 -
UVa #11093 Just Finish it up (例题8-13)
第八章的题都是掌握了算法思路就能做出来的,编程上难度不大。(间接导致了写题解花的时间比做题还长。。)这个题如果不考虑效率的话,简单的枚举起点就可以了(但是在UVa估计会TLE?)Rujia给了很好的提示:如果从 a 点出发,到 c 点会跪,那么从 a 到 c 之间的任何点出发,都会跪在 c 点上。自己做题的时候,要如何想出这样精妙的结论呢?我觉得可以在简单的暴力原创 2015-01-27 10:59:06 · 851 阅读 · 0 评论 -
UVa #10954 Add All (例题8-11)
这道题Rujia说第一反应是Huffman编码,所以就模仿Huffman编码的过程来做。可是Huffman编码保证的是编码长度乘以出现频率总和最小,和这道题求的总和可以等价吗?根据结果来看应该是一样的,但是暂时还不知道应该怎么理解。希望有人帮忙指点不知道这样考虑有没有道理:每次加法的时候,如果某个加数是之前两个数的和,那么相当于那两个数在这里又被记入了sum一次。也就是说每原创 2015-01-27 10:18:53 · 558 阅读 · 0 评论 -
UVa #11572 Unique Snowflakes (例题8-7)
给出一个序列,要求找出一个最长的连续子序列,使得这个子序列中没有重复的元素。连续、子序列、不重复,这些关键词都指向滑动窗口用STL的set和map都会比较慢,我觉得自己写hash会快一些。以后有机会再回来写hash版的吧Run Time: 1.032s#define UVa "LT8-7.11572.cpp"#include#include原创 2015-01-26 21:39:31 · 691 阅读 · 0 评论 -
UVa #11054 Wine trading in Gergovia (例题8-5)
看了Rujia的分析之后才做的,感觉这种题应该是从简单的局部开始考虑,找到一个突破口,抽丝剥茧这道题,突破口就是边界:第一个house。这个屋子的特殊性在于它是个死胡同,其他人的交易是不会经过它的,它只需要照顾好自己就可以了。那么照顾好第一个house需要运送a1的酒(无论进还是出,对于整体来说是一样的)。而这a1的酒肯定是由它的邻居-第二个house运输的(即便来源是其他原创 2015-01-26 21:30:54 · 565 阅读 · 0 评论 -
UVa #714 Copying Books (例题8-10)
Run Time: 0.016s#define UVa "LT8-10.714.cpp"char fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#includeusing namespace std;//Global Variables. Reset upon Each Case!const l原创 2015-01-27 10:14:43 · 658 阅读 · 0 评论 -
UVa #1608 Non-boring sequences (例题8-16)
Run Time: 0.458s#define UVa "LT8-16.1608.cpp"char fileIn[30] = UVa, fileOut[30] = UVa;#include#include#includeusing namespace std;//Global Variables. Reset upon Each Case!const int maxn =原创 2015-01-28 16:21:53 · 878 阅读 · 0 评论 -
UVa #1149 Bin Packing (习题8-1)
贪心法,同白书例题中的二人乘船问题#define UVa "8-1.1149.cpp"char fileIn[30] = UVa, fileOut[30] = UVa;#include#include#includeusing namespace std;//Global Variables. Reset upon Each Case!const int maxn原创 2015-01-30 13:39:40 · 937 阅读 · 0 评论 -
UVa #10366 Faucet Flow (习题8-24)
#define UVa "8-24.10366.cpp" //Faucet Flowchar fileIn[30] = UVa, fileOut[30] = UVa;#include#include#include#include#include#include#include#include#include#include#include#include#原创 2015-02-12 18:10:38 · 682 阅读 · 0 评论