
ACM
lhrsdl
这个作者很懒,什么都没留下…
展开
-
ACM日记——算法导论.15章 动态规划(一)
动态规划思想与分治思想类似,都是通过将大的问题分解成一个个更小的问题,通过更小的问题的解决来解决比它更大一层的问题,最终得到最后的结果,不过与普通分治不同,动态规划每次都会选取局部最优解,确切的说是“一个问题的最优解”,而不是“最优解”,因为一个问题可能有多个最优解。所以可以减少许多的重复过程,节约大量的时间,不过,动态规划dynamic programming 故名思义,这里的programmi原创 2014-07-25 16:19:04 · 1043 阅读 · 0 评论 -
poj3190 区间贪心 + STL
题意:n头任性的牛,每头牛都要在自己的时间段里挤奶,问最少用多少个挤奶槽并输出每头牛所在的挤奶槽的编号(从1开始)思路:目标明确,求最少用多少奶槽,并输出如何分配,明显区间贪心,找贪心的方向,就是对时间的最末端进行贪心。简单来说,先把奶牛们的时间输入并按开始时间进行排序,然后依次把有序的时间段都放入堆中,在此过程中每次取出堆中末端时间最小的和当前放入堆的时间段进行比较,如果能放到同一个槽就原创 2015-02-13 00:03:06 · 624 阅读 · 0 评论 -
poj3617 贪心
题意:对给的字符串只能进行两种操作(从头或尾拿走一个字符),使得目标字符串字典序尽可能小题意明白了思路就清晰了,字典序尽可能小,就把头和尾进行比较,如果相同就比较打头第二个和倒数第二个的大小,直到出现较小的那个再将其(首 或尾--字符)输出,一样的话随便输出头尾字符都行,注意越界并且小心PE(80个字符换一行)。#include <iostream>#include <cstdio>#in原创 2015-02-07 17:03:55 · 575 阅读 · 0 评论 -
DP入门50题(2)——NYoj252 01串
题意: 知道某一01串的长度,但他想知道不含有“11”子串的这种长度的01串共有多少个,他希望你能帮帮他。 注:01串的长度为2时,有3种:00,01,10。思路: 从长度为2开始考虑,有00,01,10三种; 长度为3,有000,001,010,101,100五种; 长度为4,有0000,0001,0010,1010,0101,1001,1原创 2015-02-23 22:09:28 · 652 阅读 · 0 评论 -
DP入门50题(4)——NYoj79 导弹拦截
题意:一种导弹拦截系统,有个缺陷,第一发炮弹能达到任意高度,但以后的炮弹都要比上一发低,问某政府只能买一套系统,最多能拦截几发炮弹。 思路:导弹拦截是经典动态规划题,这个问题其实可以看做是最长递减序列,每一发炮弹都要低于前一发的高度。那就用dp[i][j]表示j之前有多少个比i小的炮弹,取最大的就是当前dp[i][j]的值。也可以看做最长上升序列把判断条件反过来而已。代码: 这里用一维写的#i原创 2015-02-24 16:53:07 · 640 阅读 · 0 评论 -
poj1017 贪心 思维 好题
题意:运输公司有6种规格的物品各若干件:1*1 , 2*2,3*3 ,4*4,5*5,6*6的,这六种物品都要放在6*6的箱子里运输,让你求出最少用多少个箱子。 解题思路:有两种方法来做,第一种特别繁琐,也是最直接的解决方式,那就是根据常识来贪心并模拟,代码量很大,另一种和这个贪心一个思路,实现的时候非常简便,下面是贪心的大致思路: 6*6的只能用单独的箱子来放;原创 2015-02-15 19:37:33 · 1125 阅读 · 1 评论 -
DP入门50题(6)——poj1458 最长公共子序列
题意: 以样例为例说明:abcfbc ***ab***f***c***a***b 最长公共子序列为abcb,长度为4 思路: dp[i][j]表示从S串的i之前到T串j之前最长公共子序列的长度 如果s[i-1] == t[i-1], dp[i][j] = dp[i-1][j-1]+1; 否则dp[i][j] = max(dp[i-1][j原创 2015-02-24 17:23:34 · 583 阅读 · 0 评论 -
poj 1862 还是哈夫曼思想贪心
题意:科学家发现一种奇怪的玩意,他们有重量Wi, 如果他们碰在一起,总重变成2*sqrt(t1*t2)。 要求出最终的重量的最小值。思路:果然A题多点经验就用上了,跟农夫锯木头那个一个思路,哈夫曼思想,把所有重量放堆里,每次取俩最小的处理再放堆里,最后堆剩下的最后元素就是答案了代码:#include #include #inclu原创 2015-02-19 22:32:27 · 639 阅读 · 0 评论 -
poj1328 区间贪心 雷达覆盖岛屿
题目地址传送门:http://poj.org/problem?id=1328题意:给若干的岛屿坐标和雷达覆盖半径,让你在海岸线(X轴)上建立雷达站以覆盖所有岛屿,求出最少需要多少个雷达,如果不能覆盖全部就输出-1思路:典型的区间贪心,先考虑不能完全覆盖的情况,就是如果半径小于岛屿y轴高度(这个现实生活中倒是有可能出现),或者雷达覆盖面积小于等于0(这个显然扯犊子),还有一种就是岛的原创 2015-02-10 17:39:59 · 1029 阅读 · 0 评论 -
DP入门50题(7)——NYoj37 回文字符串
题意:给一个字符串,让你添加字符使其变成回文字符串,问最少添加几个 思路:开始真没思路,后来看别人的提示,可以把这个问题转化成上一题的思路——最长公共子序列问题。 就是把这个串反转,然后求这两个串的最长公共子序列,用原串长度减去最长公共子序列长度不就是要添加的字符个数啦! 代码:#include <iostream>#include <cstdio>#include <string>#原创 2015-02-24 17:32:21 · 637 阅读 · 0 评论 -
poj3262 比率贪心
题意:农夫要把满农场吃花的牛牵回去,每头牛牵回去需要花ti的时间,每头牛每秒吃ci个花,问把所有牛牵回去需要花费最少花的数量,其中ti时间需要x2,并且牛在牵走的过程中不吃花. 思路:一开始我贪心策略想错了,以为单纯按照时间长短来贪,然后再比较花费,后来发现得出答案是错的,有逻辑问题,简单取几个极限就可以证明,其实正确的贪心方法是按照比率来贪,以后遇到这样的就有经验了,按照时间和花费比从小到大排序原创 2015-02-20 11:30:25 · 1038 阅读 · 0 评论 -
DP入门50题(1) ——poj3176 数塔(详细、适合新手)
前天开始复习以前的烂摊子——DP,然后到今天,水了十二道题,现在回头边敲边写博客回忆一下。这是第一道题,也是一般ACMer的DP入门第一题吧 ^_^ 题意:大家也都知道的,输出从数塔第一层走到最后一层路径的最大值。思想:直接从底向上回溯就好了,比较直接,没有直接去套背包写的,适合新手看;首先把dp数组memset全为0,然后把数组最后一层a[n-1][i]的值赋给dp最后一层dp[n-1][i],原创 2015-02-23 21:45:04 · 857 阅读 · 0 评论 -
算法竞赛入门经典训练指南——例18 max(a[i]-a[j])且(i<j)
题意:如标题所示,给一个数组让你输出a[i]-a[j]的最大值,其中i#include <iostream>#include <cstdio>using namespace std;int a[10010],n,ans,maxi;inline int maxer(int a,int b){return a>b?a:b;}void input(){ for(int i = 0 ;原创 2015-03-26 13:49:52 · 1452 阅读 · 0 评论 -
Codeforces 295 Div2 B.Two Buttons
题意:给两个数n和m,对n能进行两种操作:将这个数*2,将这个数-1,最后使得这个数可以等于给的另一个数m。问最少需要用多少步。 思路:贪心,转换思维,可以视为让m不断靠近n,首先需要判断n和m的大小,如果n比m大那只能通过n-m步对n进行–操作,这就是这种情况的答案。 如果m>n,那就尽量让n*2靠近m,也就是m/2,当m为偶数的时候就这样操作,奇数则m++,这样操作直到n>=m,再加上此时n原创 2015-04-07 21:08:31 · 731 阅读 · 0 评论 -
codeforces 294 div2.C
题意:三人组队必须由1名大神带2个菜鸟或者2个大神带1个菜鸟组成,问最多能组几支队伍,给出大神的数量n和菜鸟的数量m 思路:竟然想麻烦了,简单的贪心,因为队伍数量最多不过(大神+菜鸟)总数的三分之一(大神:菜鸟正好为1:2或2:1)而已,结果就是大神、菜鸟和(大神+菜鸟)/3最小的那一个 即 ans = min(a,b,(a+b)/3)原创 2015-04-08 20:23:06 · 799 阅读 · 0 评论 -
DP入门50题(3)——poj2229 sumsets
题意:求n的以2的次幂之和的形式组成的方法有多少种思路: 类似递推关系,还要考虑n的奇偶性: 首先: dp[1] = 1; dp[2] = 2; 然后开始考虑从3开始: 当n是奇数的时候,dp[i] = dp[i-1]; 当n是偶数的时候,dp[i] = dp[i-2]+dp[i/2];#include <iostream>#include <cstdio>using namesp原创 2015-02-23 22:20:21 · 677 阅读 · 0 评论 -
poj3069贪心、思想、技巧
题意:设置哨兵位置,给一堆点,每个哨兵可以覆盖m米的地方(向前或向后),问如果把所有的点都覆盖到需要最少多少个哨兵点。 给一组数据,第一行两个数哨兵范围m和点的数量n 第二行n个点的位置 10 7 70 30 1 7 15 20原创 2015-02-08 20:41:13 · 609 阅读 · 0 评论 -
DP入门50题(5)——NYoj 17 单调递增最长子序列
题意:正好跟上题导弹拦截相反,只不过单调递增而已。 解法:就是上一题的a[j]>a[i]改成a[j]#include <iostream>#include <cstdio>#include <cstring>using namespace std;int Max(int a,int b){return a>b?a:b;}char s[10002];int n,dp[20002],an原创 2015-02-24 17:09:39 · 571 阅读 · 0 评论 -
几种常见排序的详细步骤(初学者参考)
#include #include using namespace std;void insort(int *,int);void csort(int *,int);void print(int *,int);void quick(int *,int,int);int p(int *,int,int);int main(){ int a[11],i,n原创 2014-01-12 21:56:03 · 939 阅读 · 1 评论 -
ACM日记——算法导论.15章 动态规划(二)
上一次我介绍了动态规划的基本思想,并且用算法导论里最简单的动态规划例子——钢条切割来加以辅助介绍,今天我会按照上次的步骤来,用另一个简单的DP例子“数塔问题”来演示动态规划的另一种最常用的实现方式——带备忘的自顶向下法(丫的就是递归-_-)。数塔问题呢,就是给你若干行(这里用n表示塔的层数)数字组成的塔,且第k层塔有k个数字,从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步原创 2014-07-25 16:22:47 · 855 阅读 · 0 评论 -
code forces 112A string的一个妙用
#include #include #include #include #include #include using namespace std;int main(int argc, char *argv[]){string s,s1;while(cin>>s>>s1){ transform(s.begin(),s.end(),s.begin(),原创 2014-07-25 16:02:03 · 792 阅读 · 0 评论 -
ACM日记——最小生成树.prim算法
今天介绍prim算法,首先说一下图以及最小生成树的概念和实际应用:在一个图中,有若干个点,点与点之间可能有相应的路径,当然也可能没有。先来介绍一些预备知识:图的一些简单介绍:图可以分为有向图和无向图,打个比方,我们在哈市take bus,如果从黑大坐车,假设先坐94路,可以坐从黑大往道外方向开的,也可以坐相反方向的,其中每个站牌为一个顶点,因为方向是确定的,所以可以理解94路的原创 2014-07-25 16:06:29 · 976 阅读 · 1 评论 -
动态规划:给自己的纠错贴(一)
太弱了,所以真的需要从头看动态规划,以前不好好原创 2014-11-13 19:37:14 · 625 阅读 · 0 评论 -
n!一共有多少位长度
任意一个正整数a的位数等于(int)log10(a) + 1;为什么呢?下面给大家推导一下: 对于任意一个给定的正整数a, 假设10^(x-1)<=a<10^x,那么显然a的位数为x位, 又因为 log10(10^(x-1))<=log10(a)<(log10(10^x)) 即x-1<=log10(a)<x 则(int)log10(a)=x-1, 即(int)log原创 2014-11-03 09:45:25 · 1311 阅读 · 0 评论 -
Codeforces Round #277.5 (Div. 2) A SwapSort 我自己写的奇葩代码竟然AC了。。。自己都觉得不可思议
就是模拟,考察基本功的#include #include #include #include #include #include #include #include #include #define maxn 0XFFFFF #define MAX 0xFFFFFFF#define lson l,m,t#define rson m+1,r,t原创 2014-11-19 21:29:32 · 596 阅读 · 0 评论 -
树状数组求逆序数--poj 2299
突然想起树状数组了,因为突然想起之前从来没A掉的那个树状数组求逆序数的题原创 2014-11-04 19:19:19 · 616 阅读 · 0 评论 -
poj3268 单源最短路径+矩阵转置
这个题的意思是一群牛要聚会,在某一头牛的家里聚会,原创 2014-11-07 19:18:46 · 636 阅读 · 0 评论 -
毛毛虫算法——尺取法
有这么一类问题,需要在给的一组数据中找到不大于某一个上限的“最优连续子序列”于是就有了这样一种方法,找这个子序列的过程很像毛毛虫爬行方式,我管它叫毛毛虫算法,比较流行的叫法是“尺取法”。 喏,就像图里的妹纸一样~ 还是举个栗子: Poj3061给长度为n的数组和一个整数m,求总和不小于m的连续子序列的最小长度输入n = 10,m = 155 1 3 5原创 2015-02-01 21:34:26 · 2944 阅读 · 0 评论 -
HDU 1003 MAX SUM 贪心
原来就写过的经典贪心,本来今天想用尺蠖法再写的,后来发现好像写不出来。。。其实也不太算贪心,就是从头扫到尾,找当前的子序列的大小关系:初始化sum和ans都为负无穷,然后从头开始扫,伪代码如下:sum if: sum t_start = t_end = i sum = a[i] if: sum > ans ans = sum; start = t_start原创 2015-01-13 16:24:37 · 607 阅读 · 0 评论 -
poj3253 哈夫曼贪心
题意:把木板切成长度如第二行(及以后)的n块(第一行为n)木板,且切断木板耗费的能量为当前木板本身的长度,想办法求出 所需最少能量并输出。 注意:输出结果要用long long 来存,int存不下 思路:先找问题切入点,求出所需最少能量,那就考虑怎样才能在给定的切割方案中寻找最省力的方案。 从这题给的数据来看就要倒过来想问题,也就是说把一段段切好的木板不断合拢回原来长度原创 2015-02-08 21:33:09 · 614 阅读 · 0 评论 -
poj2287 田忌赛马
题意:田忌和齐王各有n匹马,想办法尽可能让田忌赢更多的钱,赢一场200,输一场-200,平不扣。贪心思想:先拿田忌最好的马跟齐王最好的马比: 如果快则赢下,如果慢则用最慢的马跟齐王最快的马比 如果一样快则比较二者最慢的马: 如果田忌的慢马比齐王的慢马快则赢下 反之就用田忌的这个慢马跟齐王最快的马比(反正这匹马输定了,那就让它输原创 2015-02-09 14:14:34 · 821 阅读 · 0 评论 -
poj2376区间贪心
题意:给出n段区间和区间长度T(从1开始),以下n行为每段区间的首位地址,求最少需要几段将所有区间覆盖,如果不能全覆盖就输出-1.原创 2015-02-09 23:32:03 · 622 阅读 · 0 评论 -
NYoj_DP_289苹果(01背包)
题意:裸01背包,第一行给出n个苹果和容量为m的背包,接下来n行为每个苹果的重量和价值。输出背包能装下的最大价值为多少。 思路:dp公式:dp[j] = max(dp[j],dp[j-cost[i]]+v[i]); 其中dp[j]的值代表当前背包剩余容量为j时最大价值。dp[j-cost[i]]为当前背包装入苹果i的时候(此时背包剩余容量为j-cost[i]),那价值就为dp[j-cost[i]原创 2015-04-08 21:23:17 · 681 阅读 · 0 评论