
高效算法——贪心法
文章平均质量分 72
XDU_Skyline
Everything is over, everything is just beginning.
展开
-
例题8-5 Gergovia的酒交易 UVa11054
1.题目描述:点击打开链接2.解题思路:考虑最左边的村庄,假设需要买酒,即a1>0,则一定有劳动力从第二个村庄往左给村庄1送酒,而不必考虑酒是从哪里来的。这样,问题就转化成只有村庄2~n,且第2个村庄的需求为a1+a2的情况。这样的推理对a13.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include原创 2015-02-06 12:46:00 · 736 阅读 · 0 评论 -
#301 (div.2) B. School Marks
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决。比赛的时候看错了,把y理解成了最小值,花了半天去写一个错误的代码,最后才发现y指的是中位数。。教训颇为惨痛!本题可以先满足中位数y的要求,剩下的都设为1即可。给定了n,那么可知,至多只能有(n-1)/2个数要小于中位数y。因此可以事先统计一下输入的数中有xc1个是小于y的,同时累加和sum。如果sum>x或c1>(n-1)/2,则无解原创 2015-05-01 13:03:03 · 664 阅读 · 0 评论 -
#292 (div.2) D.Drazil and Tiles
1.题目描述:点击打开链接2.解题思路:本题一开始迟迟没有好的思路,随后通过思考,发现应该用贪心法解决:首先应该着力填充周围只有一个空格的点,随后以它的空格为中心,再不断向外拓展,直到整个界面被填充。这样便解决了本题。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#include#i原创 2015-03-02 12:11:04 · 851 阅读 · 0 评论 -
例题8-4 传说中的车 UVa11134
1.题目描述:点击打开链接2.解题思路:这道题利用贪心法,由于横坐标和纵坐标没有任何关系,因此可以分别处理。对于横坐标或纵坐标,贪心策略是:先按照区间右端点从小到大排序,若相同,再按照区间左端点从大到小排序,保证这种情况下长度短的在前,长的在后;每次都从区间的左端点出发,如果该位置已经被占据,则继续向后移动,如果移动到超出了区间右端点,则无解。(这道题我思考了三个贪心策略,第一个是按照右端点从原创 2015-02-05 21:14:06 · 1807 阅读 · 1 评论 -
#106 (div.2) A. Business trip
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决。首先对数组排序,由大到小选择,恰好大于等于k时候停止即可。如果全部相加仍然小于k,则无解。3.代码:#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#include#include#include#include#原创 2015-07-30 23:04:25 · 603 阅读 · 0 评论 -
#142 (div.2) A. Dragons
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决,首先将strength和bonus定义为一个结构体,首先按照strength从小到大排序,若相同,则按照bonus从大到小排序。然后从头到尾扫描一遍即可。3.代码:#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#incl原创 2015-07-30 21:57:17 · 596 阅读 · 0 评论 -
#263 (div.1) A. Appleman and Toastman
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决。根据题意描述,较大的数应该尽量多加几次,较小的数可以提前抛弃,因此事先对数组由小到大排序,然后一个个的抛弃较小的数即可。3.代码:#define _CRT_SECURE_NO_WARNINGS#include#include#include#include#include#include#include#inc原创 2015-07-30 22:16:01 · 690 阅读 · 0 评论 -
HDU 5386 Cover (2015年多校比赛第8场)
1.题目描述:点击打开链接2.解题思路:本题利用逆向思维+贪心法解决。因为题目中已经告诉我们一定存在解,因此可以考虑贪心法的使用。这道题的妙处在于答案和初始矩阵是无关的,只和目标矩阵有关。因为不管初始矩阵长什么样,只要操作一样,加上解的存在性,得到的目标矩阵一定是相同的。接下来就是如何寻找操作序列。假设最后一步操作执行后,我们得到了目标矩阵,由于所有操作都是对一整行或者一整列进行的原创 2015-08-15 10:30:00 · 841 阅读 · 0 评论 -
HDU 5360 Hiking (2015年多校比赛第6场)
1.题目描述:点击打开链接2.解题思路:本题利用优先队列解决,然而在这次多校的比赛时候并没有往这个角度考虑,最终要么WA要么TLE==。其实本题的贪心策略很好想:如果把题目中的人数看做数轴上的点的话,那么应该按照从0依次递增的顺序来选择区间,把符合条件的区间预先存起来,然后按照他们的终点由小到大排序,第一个就是我们要的区间,如果遇到第一个区间的终点也小于当前值,那么也将他放入ans数组,只不过原创 2015-08-06 20:52:11 · 1033 阅读 · 0 评论 -
例题1.20 流星 UVa1398
1.题目描述:点击打开链接2.解题思路:本题实质上是求当若干个时间区间相交最多的时的个数。首先,求出每个流星落入方框内的时间段(L,R)(这里用开区间,防止精度问题导致误差)。然后就相当于一道贪心法的题目了。定义时间线“碰到一个左端点”或“碰到一个右端点”为一个事件,那么每次遇到一个“左端点事件”,cnt++,并维护目前遇到的最大值;碰到“右端点事件”,cnt--。不过在排序的时候会遇到一个问原创 2015-03-15 16:44:41 · 751 阅读 · 0 评论 -
#300 (div.1 2) C. Tourist's Notes
1.题目描述:点击打开链接2.解题思路:本题利用代数分析来解决。由于要找一个最高的海拔,考虑到它受到变化量不超过1的约束,因此可以通过列方程解得连续两个输入之间的最高海拔。假设第一个输入是d1,h1,第二个输入是d2,h2.设d1,d2之间第k天海拔最高,最高的海拔为h。不难得到如下两式:h-h1=k-d1;h-h2=d2-k;可以解得h=(d2-d1+h1+h2)/2。设最终答案原创 2015-04-27 13:06:01 · 973 阅读 · 0 评论 -
#298 (div.2) B. Covered Path
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决。一开始想着利用dfs解决,不过最终意料之中地TLE了,因为每次可以选择的速度增加量有很多,一共2*d个,这样的话,时间复杂度是O(T*D^T)达到了指数级别。所以应当改变思路,想办法求出每个时刻的最大值。通过尝试可以发现,每个时刻的最大值都满足一定的约束关系。设此时为时刻i,上一次的速度为p,那么本次的速度应为max(p+d,v2+(原创 2015-04-13 10:44:37 · 770 阅读 · 0 评论 -
例题1.15 网络 UVALive 3902
1.题目描述:点击打开链接2.解题思路:本题要求放置尽可能少的服务器,使得所有的客户端到最近的服务器的距离都不超过k。由于已经放置了一个服务器,不妨把它当做根结点,先把无根树转化为有根树,然后我们考虑最深的叶子,那么不难证明,该叶子结点的最优服务器的放置位置是它的k级祖先。这样本题的算法便不难想出:从最深的叶子开始枚举,并在它的k级祖先处放置一个服务器,同时标记该服务器能覆盖到的所有结点,这样原创 2015-03-13 23:05:09 · 717 阅读 · 0 评论 -
例题8-10 抄书 UVa714
1.题目描述:点击打开链接2.解题思路:本题要求“最大值最小”,这是一种很常见的优化目标。不妨考虑这个问题:能否把输入的序列划分为k个连续子列,使得所有的S(i)均不超过k?若定义一个谓词P(x),则让P(x)为真时x最小就是答案。那么如何求P(x)呢?根据题意可以选择如下贪心策略:从后往前扫描,每次都尽可能多的向左分,如果分不下去了,标记此时的位置。这样在O(N)时间内就能计算出P(x)的结原创 2015-02-06 16:57:47 · 649 阅读 · 0 评论 -
习题8-1 装箱 UVa1149
1.题目描述:点击打开链接2.解题思路:本题是贪心法的经典例题,贪心策略是:最短的和最长的匹配,次短的和次长的匹配,以此类推。如果不能匹配,则等待。注意要先排序。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#include#include#include#include#in原创 2015-02-08 11:14:11 · 696 阅读 · 0 评论 -
例题8-1 煎饼 UVa120
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决,按照题意,可以先复制原队列,并排好序,从大到小以此把每个数排到正确位置,方法是:先翻到上面,再翻到正确位置,每翻一次,都要判断队列是否已经排好,如果本来就在最顶层,或局部和排过序的队列相同,可以跳过,无需翻转3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include原创 2015-02-04 22:50:00 · 1119 阅读 · 0 评论 -
习题8-10 奇怪的股市 UVa1614
1.题目描述:点击打开链接2.解题思路:本题其实等价于找一些数,使得他们的和等于sum/2,猛一看不知道如何下手,其实很简单:从后往前一个个试即可,如果相加后大于sum/2,必然不是这一组的数,由于必然有解,因此这样做最后一定能找到解。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#i原创 2015-02-09 18:49:19 · 745 阅读 · 0 评论 -
习题8-4 奖品的价值 UVa11491
1.题目描述:点击打开链接2.解题思路:本题利用贪心法,最好边输入边处理,由于需要删除d个数字,即保留n-d个数字。假设变量i来扫描输入的第i个数字(从0开始),那么待填写的数字还有n-i个。令变量k表示第k个已经填写的数字,只有当kn-d,即已填写的数字加上等待填写的所有数字大于要保留的数字个数时,需要替换已经填写的数字,此处的贪心策略是:设当前输入的数是c,那么k向前寻找恰好大于c的那个数原创 2015-02-09 15:22:54 · 1945 阅读 · 2 评论 -
#297 (div.2) C. Ilya and Sticks
1.题目描述:点击打开链接2.解题思路:本题要求在一些木棍中找出能够拼成长方形的四根木棍,使得拼出的所有长方形的总面积尽量最大。木棍可以截去1个单位长度。这道题本来理解错了,以为找最大的长方形的面积,纠结了一晚上,直到比赛结束都不明白为啥第四组数据就WA了==。先对小木棍排序,只用从n-2开始逆序地贪心选择就行。如果L[i]==L[i+1]或L[i]==L[i+1]-1,那么把L[i]加入到v原创 2015-03-27 13:02:29 · 682 阅读 · 0 评论 -
例题1.1 勇者斗恶龙 UVa11292
1.题目描述:点击打开链接2.解题思路:本题用贪心法解决,事先对恶龙的直径,能力值从小到大排序,由于要试图杀掉所有的恶龙,因此枚举每只恶龙,用cur来表示当前骑士的下标,如果他恰好能杀掉恶龙,就用他,否则尝试下一个。如果cur与m相等时退出循环,若此时恶龙仍未被杀光,则无解,反之输出ans。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#原创 2015-03-09 23:19:19 · 957 阅读 · 0 评论 -
例题8-11 全部相加 UVa10954
1.题目描述:点击打开链接2.解题思路:根据题意描述,可以选择如下贪心策略:每次都选择两个比较小的数,相加后的结果放回队列中,而取最小值出列正好可以运用STL的priority_queue3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#include#include#include原创 2015-02-06 18:43:30 · 589 阅读 · 0 评论 -
例题1.2 突击战 UVa11729
1.题目描述:点击打开链接2.解题思路:本题利用贪心法解决。由于让总时间最短,因此可以先安排执行时间最长的任务,因为安排任务的总时间是无法改变的,总时间取决于执行任务的最长时间,因此应该先安排执行时间最长的任务。具体证明自己画图即可得证。3.代码:#define _CRT_SECURE_NO_WARNINGS #include#include#include#include#原创 2015-03-10 16:04:05 · 715 阅读 · 0 评论 -
#310 (div.2) D. Case of Fugitive
1.题目描述:点击打开链接2.解题思路:本题利用贪心法+优先队列解决。不过本题的贪心策略的选取是关键,有些看似正确的贪心策略实际上暗含危险。先说说正确的贪心策略:将所有的岛按照顺序求出第i个岛和i+1个岛之间桥的最小最大长度,并按照L从小到大排序,若相同则按照R从小到大排序。然后对桥由小到大排序,将所有的桥扫描一遍,枚举第i个桥时,将L值小于等于当前桥的区间按照(R,id)放入优先队列,R小的原创 2015-08-20 23:48:01 · 746 阅读 · 0 评论