ACM_思路算法杂题
文章平均质量分 68
亚N程
这个作者很懒,什么都没留下…
展开
-
UVa:1368 DNA Consensus String
贪心,只要保证和每一位上出现次数最多的字母相同即可。如果有多个次数最多相同的则选择字典序最小的。 #include #include #include #include #include #include #include #include #include #include #define MAXN 1005 #define MOD 100000原创 2014-01-24 12:59:36 · 592 阅读 · 0 评论 -
UPC:2543 Job!Job!Job!(贪心+优先队列)
http://acm.upc.edu.cn/problem.php?id=2543 贪心+优先队列。 之前做过这类在时间轴上解决带权值的区间问题,一直都是用贪心+优先队列的方法。 比赛的时候看了一下觉得没思路就没多想。后来看题解发现是贪心+优先队列,就立刻想到了方法。需要总结和反思。 枚举每个时刻从m到1,将该时刻要截至的任务放进优先队列每次弹出当前权值最大的任务并完成。 注意如果某任务原创 2014-03-25 14:17:31 · 693 阅读 · 0 评论 -
UVa:10148 Advertisement(贪心)
贪心。要求每个区间至少有k个点覆盖,如果区间长度不足k则全部有点覆盖。 根据区间右端点从小到大排序,如果右端点相同则根据左从小到大排序。对于每个区间选取右边k个端点。这里有个问题就是,如果该段区间已经选过一部分点了,那需要统计一下已经选过多少点,我这里用了最笨的办法,直接数(由于区间有负数,所以都加了10005来消掉负数),这样再把剩下的点选够即可。 这样最坏的情况是1000*20000,居然原创 2014-02-06 18:02:42 · 602 阅读 · 0 评论 -
POJ:1741 Tree(男人八题-树分治)
题意:给一棵树,问两个结点之间的距离小于等于K的有多少对。 思路:男人八题之一。使用树分治解决。简单来说,对于一棵树的。那么答案分为三种情况,1,两个结点在该根结点的子树上,此情况递归解决;2,两个结点在根的两个子树上,对于这种情况,我们可以找出所有结点到该根节点的距离,这个过程是O(n),对距离排序(O(nlogn))以后,可以O(n)求出小于等于K的对数,但注意这种方法和情况1中有重复,要删原创 2015-04-15 22:03:44 · 671 阅读 · 0 评论 -
SDUT:2157 Greatest Number(中途相遇法)
题意:一些数,选4个(可重复),输出最接近给定数字的和。 思路:经典题目,使用中途相遇法可做。先枚举两个数字,求和存入并排序。再枚举两个数字,根据缺少部分,二分之前的和,取最大值。 STL是神器,要学会使用。 #include #include #include #include #include #include using namespace std; typedef lon原创 2015-04-23 16:09:46 · 575 阅读 · 0 评论 -
UPC:2219 A^X mod P(预处理空间换时间)
题意:按公式求f[x],再按公式求结果。 思路:直接搞的话f[i]可能高达10^9,n为10^6,即使用快速幂也会超时。用空间换时间是一种常见的降低复杂度的办法。对于任意一个数字X,它可以变成X=a*N+b(N为常数)。基于这个思路可以把f[n]=a*N+b,如果取N=10^5,那么可以保证a最大为10^4,b最大为10^5。这样A^f[n]=A^(a*N+b)=A^(a*N)*A^b=(A^N原创 2015-04-06 22:27:00 · 466 阅读 · 0 评论 -
UVa:11925 Generating Permutations
题意:由一个排列,给两种操作(1,交换头两个数字;2,将第一个数字放到最后)。问从由一个升序原始序列1,2,3...n变成给定排列的操作序列是什么? 思路:注意题意,不要搞错了,是从123...变成给定排列,而不是给的排列变成123..这样。显然从给定的变成有序状态比较好做,所以可以逆向思考。操作1不变,操作2等价于将尾部数字放到头部,这样最后只需要逆序输出操作序列即可。具体做法用操作1每次维护原创 2015-03-15 12:00:25 · 1433 阅读 · 0 评论 -
UVa:1422 Processor
二分+贪心。 二分答案,然后需要判断该速度时能否完成所有任务。每次优先去做结束时间早的任务。这样从1开始枚举每个时刻,如果该时刻是某任务的左端点就把它放进优先队列,然后每一秒优先去做结束时间早的任务。这里有个非常恶心的地方,如果你在这一秒内完成了这个任务,但是这一秒还没有结束,那么你可以把余下的时间去做另一个任务。用另一种角度阐述就是,如果某一秒速度v>某任务的工作量w,那么多出来的(v-w)这原创 2014-02-13 14:54:21 · 622 阅读 · 0 评论 -
UVa:1554 Binary Search
这个题直接枚举i+1到10000就行。 但是题目哪里说N最大是10000呢。。 #include #include #include #include #include #include #include #include #include #include #include #define ll long long #define INF 2139062143 #def原创 2014-03-21 20:25:04 · 641 阅读 · 0 评论 -
POJ:3320 Jessica's Reading Problem
watashi书上的例题,用了一个叫尺取法的东西,两个例题都是求最短区间的问题。主要是维护首尾两个指针i,j。当区间满足要求的时候,不断增大i以缩小区间长度来看是否能达到最优解,如果区间不满足要求,则增大j。 这个题关于知识点的东西很难表示,用了map。当出现一个新的知识点,此时map中的元素等于出现的知识点时说明满足要求。当失去一个知识点使得map中的元素个数不等于出现的知识点时则不满足要求。原创 2014-01-27 23:52:09 · 721 阅读 · 0 评论 -
UVa:1330 City Game
这个题感觉很好。将时间转为空间,巧妙降维。 思路参考了入门指南。 值得一提的是关于up、left、right这三个数组的递推。up很好想。left的时候要注意,如果某一列的up小于等于左邻的up,这说明该列悬线是可以左移到左邻这列可到的最远左边界的,否则该列可达最远左边界就是当前这列本身。right需要从右往左递推,思路类似。 #include #include #include原创 2014-03-07 21:52:50 · 685 阅读 · 0 评论 -
UVa:1382 Distant Galaxy
错了一个小地方调了一上午。。跪。。 首先要将所有点离散化,这里注意所有出现的数字最多是不只100个的,因为有x和y两个坐标,所以数组要开200。 特判只有一行的情况。其他时候枚举上下两行,注意此时i!=j,根据left【r】-left【l】+on【l】+on2【r】,维护-left【l】+on【l】的最大值,枚举j,可以在O(n)内求出。 注意l #include #include原创 2014-03-08 11:38:05 · 892 阅读 · 0 评论 -
UVa:10755 Garbage Heap
长方体中求价值最大的子长方体。由于之前做过一维和二维的所以这个相对来说比较好想。枚举高的上下界,用时O(n^2),这样问题就转化为二维长求最大子矩形,这个问题可以使用前缀和+DP在O(n^3)内解决。时间复杂度为O(n^5)。注意题中每个价值范围在正负2^31之内,所以求最大值,ans初值应该取最小,则至少应该取负2^31。另外注意每个样例之间有个空行。 #include #include原创 2014-03-08 12:25:19 · 693 阅读 · 0 评论