随笔分类 -  贪心算法

摘要:原题链接:http://poj.org/problem?id=3553 这道题主要就是贪心思想吧,对于每个job,根据其截止时间 dj从小到大排序,我们必须要尽快把dj最小的job完成掉,这样才能使max{Cj-dj, 0}最小(因为对于最小dj在没完成该工作时dj使不变的,如果你先做了其他没关联的工作,只会使Cj变大,从而使max{Cj-dj, 0}变大,这和题目所求刚好相反了)。因为要完成dj工作会需要先完成其他工作,那么这时候dfs一下,一步一步找到其祖先打印出来即可。 网上有人用的拓扑排序+贪心,我表示没看懂。 1 #include 2 #include 3 #includ... 阅读全文
posted @ 2013-07-26 20:14 芒果布丁 阅读(463) 评论(0) 推荐(0)
摘要:原题链接:http://codeforces.com/problemset/problem/219/E 这题和hotel那题很像,一开始想到的是用线段树,设0为空位,1为占位,那么需要维护左端最长0,右端最长0,中间最长0,然后在插入删除操作中需要考虑区间的合并,区间的分解等问题……瞬间就被恶心到了。 网上看到别人一种奇妙的做法,运用STL里面的set容器进行一个模拟线段树而又类似贪心的做法,代码量大大减少了,写起来非常方便。用了set容器,那么这道题就是纯粹的对set进行增加删除元素了。View Code 1 /* 2 代码出处:http://www.cnblogs.com... 阅读全文
posted @ 2012-12-06 10:38 芒果布丁 阅读(279) 评论(0) 推荐(0)
摘要:原题链接:http://codeforces.com/problemset/problem/3/B 看了好久才明白题意:有一辆卡车,要装载一些船只,这些船只分为“1”和“2”两种,再给出n只船的类型及其capacity(理解为“价值”会更好),要求给定卡车容量v的情况下求最大装载价值。 理解完题意之后我想是背包问题吧,但是所给v达到10^9。 其实这道题用的是贪心思想。 首先把两种船只分开,分别进行排序。最优解总是先取价值高的。可以O(n)的时间复杂度枚举选择i只“1”船,则选择“2”船只的个数就是min((v - i) / 2, tc),tc为“2”船总个数,后面的处理就不难了。... 阅读全文
posted @ 2012-11-26 19:14 芒果布丁 阅读(499) 评论(0) 推荐(0)
摘要:原题链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2829 贪心。因为交代任务的时间Bi是不能减少的,所以首先交代完成时间Ji最长的部下。过程中更新最短所需时间。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 #define INF 10000000 5 #define N 100 阅读全文
posted @ 2012-11-01 13:25 芒果布丁 阅读(170) 评论(0) 推荐(0)
摘要:原题传送:http://poj.org/problem?id=1328 贪心。 每个岛屿在海岸线上都有一个雷达覆盖区间[x - sqrt(r2 - y2), x + sqrt(r2 - y2)],将这些区间按左区间从小到大排序,选择第一个区间,然后在后面找能够重叠的区间,如果能够重叠,那么更新该区间的右端点(取小的),遍历一遍就完事儿了。 (ps:有时候调了精度反而会wa)View Code 1 #include <stdio.h> 2 #include <math.h> 3 #include <string.h> 4 #include <algori 阅读全文
posted @ 2012-10-10 09:38 芒果布丁 阅读(185) 评论(0) 推荐(0)
摘要:原题传送:http://poj.org/problem?id=2287贪心算法: 1. 田忌要尽可能用最慢的马去赢齐王最快的马。 2. 能赢就赢。 一开始我不是这么想的,我是用田忌最快的马和齐王最快的马比较,如果田忌慢,那么换田忌最慢的马和谐掉齐王最快的马,那么田忌剩下的马赢的次数就能多点。但是这种想法是错的,这样过不了下面这组测试数据:35 5 35 4 2答案:400View Code 1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #define MAXN 1005 阅读全文
posted @ 2012-09-20 23:32 芒果布丁 阅读(213) 评论(0) 推荐(0)
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=4268 贪心算法。 对a、b数组进行二维排序(先按长h从小到大排序,相同的h按宽w从小到大排序),对于b的h小于a的h,把b的w添加到集合中,并从集合里面选择一个可以覆盖的最大的w即可(因为此时由于第一维h已经满足覆盖条件,只需要考虑第二维的w)。 这道题在比赛的时候没做出来,后来看了解题报告,才发现STL神器之multiset,这就是比赛时苦苦寻找的数据结构啊!这东西自己从来没用过的,此刻必须记录下它的两个重要特点: 1.它有优先队列的性质,插入的元素是有序的,插入复杂度和priori... 阅读全文
posted @ 2012-09-17 18:40 芒果布丁 阅读(323) 评论(0) 推荐(0)
摘要:原题传送:http://acm.hdu.edu.cn/showproblem.php?pid=3697 贪心算法。起始点可能是0,1,2,3,4,枚举这5个起始点,后面的点选择可选策略是:选择符合该时刻且结束时间最早的。View Code 1 #include <stdio.h> 2 #include <string.h> 3 #define N 305 4 struct course 5 { 6 int s, t; 7 }e[N]; 8 9 int n;10 bool vis[N];11 12 void work()13 {14 int ans, i, j, k, . 阅读全文
posted @ 2012-09-13 11:59 芒果布丁 阅读(278) 评论(0) 推荐(0)