=====算法相关=====
文章平均质量分 76
hcbbt
这个作者很懒,什么都没留下…
展开
-
HUST 1328 String KMP 递增思路
题意:求各个前缀在字符串中的出现的个数和。KMP匹配一次的复杂度是0(n),这题如果暴力查找前缀进行KMP匹配的话,果断会跪。其实这题又是一题next数组的应用。我们可以递推,每次仅仅看前i个字符,看看它的增加会影响到多少个匹配,很明显,next[i]能影响的它也能影响,而它又影响自己本身。这样就能解出来了。非常蛋疼地送了几个WA給了long long...代码:/**原创 2013-12-01 19:56:18 · 1534 阅读 · 0 评论 -
POJ 2752 KMPnext的应用
题意:求字符串的前缀和后缀相同的所有长度。其实只要理解了next数组就行了,s[1~next[j]] = s[1+j-next[j] ~ j],所以,求完最长的长度,也就是前缀是s[1~next[len]],然后直接递归把这个前缀当做字串去求最长合法串就行了。描述比较渣,在纸上画出字符串和next数组,就知道了。代码:/** Author: illuz * Blo原创 2013-11-28 14:48:26 · 1311 阅读 · 0 评论 -
UVA 10201 Adventures in Moving - Part IV 车站加油 dp
题意:一辆车要求到达指定远的目标地点,一路上又一些加油站,给出加油站的位置和价格,出发时车100L汽油,要求到达目的地点也要有100L汽油。这道题做了好久,dp[i][j]表示在第i站还有j升油的花费,状态转移是在第i站加油或不加,不加油就是上一站的对应汽油时的花费,加油的话就是min(dp[i][j], dp[i - 1][j - k + d[i] - d[i - 1]] + k * p[i原创 2013-11-17 14:11:39 · 1697 阅读 · 0 评论 -
HDU 1671 Phone List 二叉树水题 数组建树法
题意:给出几个号码,问里面有没有某个号码是另一个号码的前缀。很水的二叉树题,用建树的方法很快就能做出来,感觉不过瘾,写了个数组的建树方法。不过后面发现也是很搓的算法,时空都不划算,Orz不想多说。代码:/** Author: illuz * Blog: http://blog.csdn.net/hcbbt* File: hdu1原创 2013-10-15 23:10:17 · 1741 阅读 · 0 评论 -
UVA 10066 The Twin Towers 双塔 LCS,dp
题意:求最长公告子序列。裸体,压缩了空间做的,O(n^2)做法,有空研究下nlogn做法。代码:/** Author: illuz * Blog: http://blog.csdn.net/hcbbt* File: uva10066.cpp* Create Date: 2013-09-21 09:31:21* Descrip原创 2013-09-21 10:41:36 · 1674 阅读 · 0 评论 -
UVA 10131 Is Bigger Smarter? 越大越聪明? dp,LDS
题意:大象真的越大越聪明吗,找出体重递增IQ递减的最长大象序列。很明显的最长递降子序列,先把体重排序,体重一样的按iq递减排,这样就能出来了。代码:/** Author: illuz * Blog: http://blog.csdn.net/hcbbt* File: uva10131.cpp* Create Date: 2013原创 2013-09-21 10:38:47 · 1165 阅读 · 0 评论 -
UVA 116 Unidirectional TSP 经典dp题
题意:找最短路,知道三种行走方式,给出图,求出一条从左边到右边的最短路,且字典序最小。用dp记忆化搜索的思想来考虑是思路很清晰的,但是困难在如何求出字典序最小的路。因为左边到右边的字典序最小就必须从左边开始找,于是我们可以换个思路,dp时从右边走到左边,这样寻找路径就可以从左向右了。代码:/** Author: illuz * Blog: htt原创 2013-09-21 10:35:20 · 3346 阅读 · 0 评论 -
UVA 10003 Cutting Sticks 切木棍 dp
题意:把一根木棍按给定的n个点切下去,每次切的花费为切的那段木棍的长度,求最小花费。这题出在dp入门这边,但是我看完题后有强烈的既是感,这不是以前做过的石子合并的题目变形吗?题目其实就是把n+1根木棍合并成一只长木棍,花费为合并后的木棍长度。于是我很开心地用优先队列敲完代码,wa了。。。后来发现两个木棍的序号必须是连续的,用优先队列会把序号打乱。每次删减中间的一个数又很费时间,于是原创 2013-09-21 10:29:42 · 3135 阅读 · 0 评论 -
UVA 674 Coin Change 换硬币 经典dp入门题
题意:有1,5,10,25,50五种硬币,给出一个数字,问又几种凑钱的方式能凑出这个数。经典的dp题。。。可以递推也可以记忆化搜索。。。我个人比较喜欢记忆化搜索,递推不是很熟练。记忆化搜索:很白痴的算法,直接交给下一层去算,算完记录下来以免之后重复算。代码:/** Author: illuz * Blog: http://blog.c原创 2013-09-21 10:09:19 · 8202 阅读 · 0 评论 -
UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子。要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明是箱子小于,重载然后就是正常的dp最长路的搜索了。代码:/** Author: illuz * Blog: http://blog.csdn.net/原创 2013-09-20 11:34:08 · 2219 阅读 · 0 评论 -
Codeforces Round #200 (Div. 2) 水题4道~
今晚是第200场,在div2水了几题水题。。。第三题始终找不到思路,还是赛后做的。。。嘛,这次总算是做出了三题,还没被hack,感觉还不错,不过这次实在太水了,rating没降实在不错~姑且贴下代码吧~A - Magnets题意:01和10代表一个磁铁的两种摆法,1,0表示正负极,同性相斥异性相吸,问排成一排后会变成几组磁铁。简单模拟。。。代码:/** Au原创 2013-09-15 11:05:25 · 3443 阅读 · 6 评论 -
UVALive 3635 Pie 切糕大师 二分
题意:为每个小伙伴切糕,要求每个小盆友(包括你自己)分得的pie一样大,但是每个人只能分得一份pie,不能拿两份凑一起的。做法:二分查找切糕的大小,然后看看分出来的个数有没有大于小盆友们的个数,它又没说每个pie都要分完,分不完的留给工作人员吃嘛。代码:/** Author: illuz * Blog: http://blog.csdn.net/hcbb原创 2013-09-10 01:04:24 · 2177 阅读 · 0 评论 -
UVALive 3971 Assemble 电脑配件 二分+贪心
题意:某人想组装电脑,有很多电脑配件可以选,每样都有它的价格和质量,每种配件一定要买一个,现在给出钱数,求能组装出来的电脑里面配件质量最便宜的是多少。当然不能超出预算的啦。每次枚举那个最便宜的,然后贪心,每次找价格最小且价格大于最便宜的,如果超支就向前二分,否则向后二分。这题折腾了一晚上 = =,差点跪了。。。最后发现排序没处理好,郁闷。。。得先排前再排质量。代码:/** Au原创 2013-09-10 00:21:47 · 1846 阅读 · 0 评论 -
UVALive 2519 Radar Installation 雷达扫描 区间选点问题
题意:在坐标轴中给出n个岛屿的坐标,以及雷达的扫描距离,要求在y=0线上放尽量少的雷达能够覆盖全部岛屿。很明显的区间选点问题。代码:/** Author: illuz * Blog: http://blog.csdn.net/hcbbt* File: l2911.cpp* Create Date: 2013-09-09 20:51:原创 2013-09-09 21:11:19 · 1745 阅读 · 0 评论 -
Huffman编码的不建树做法 UVALive 2088 Entropy
题意:huffman编码,不懂看coolshell大神的博文,要求输出最优码长和原始码长以及比值。(原始码长就是每个字符都是按8个长度算)分析:本来huffman编码还好,但是用建树敲完一遍调了半天,实在蛋疼(果然我编码能力太渣)。于是我开始想不建树的算法,想了半天,终于YY出一个算法 = =。(借用coolshell的例子来说)字符次数原创 2013-09-08 23:37:53 · 2100 阅读 · 2 评论 -
hdu 4715 Difference Between Primes 2013年ICPC热身赛A题 素数水题
题意:给出一个偶数(不论正负),求出两个素数a,b,能够满足 a-b=x,素数在1e6以内。只要用筛选法打出素数表,枚举查询下就行了。我用set储存素数,然后遍历set里面的元素,查询+x后是否还是素数。注意,偶数有可能是负数,其实负数就是将它正数时的结果颠倒就行了。代码:/* * Author: illuz * Blog: http://bl原创 2013-09-08 22:57:58 · 1820 阅读 · 0 评论 -
hdu 4708 Rotation Lock Puzzle 2013年ICPC热身赛A题 旋转矩阵
题意:给出一个n*n的矩阵,旋转每一圈数字,求出对角线可能的最大值,以及转到最大时的最小距离。只要分析每一层就可以了,本来想用地址传递二维数组,发现行不通,改了一下就行了。这里有个坑,比如:1 1 9 9 11 1 1 1 11 1 1 1 11 1 1 1 1很明显最大的就是将一个9转到矩阵角,而这里更新最大值时很容易把另一种情况屏蔽掉,从而错过了更少步骤达到最大值的原创 2013-09-08 22:52:30 · 1535 阅读 · 0 评论 -
hdu 4707 Pet 2013年ICPC热身赛A题 dfs水题
题意:linji的仓鼠丢了,他要找回仓鼠,他在房间0放了一块奶酪,按照抓鼠手册所说,这块奶酪可以吸引距离它D的仓鼠,但是仓鼠还是没有出现,现在给出一张关系图,表示各个房间的关系,相邻房间距离为1,而且图中没有回路,每个房间都是联通的,求仓鼠可能出现的房间的数量。很容易的dfs,50000个房间数据量比较大,用数组难以保存,于是用vector储存关系表。遍历过去,遍历过几个房间,那剩下的就是仓鼠原创 2013-09-08 22:44:37 · 2116 阅读 · 0 评论 -
hdu 4706 Children's Day 2013年ICPC热身赛A题 模拟
题意:按字母顺序排列成n型,简单的模拟题。当字母排到z时从a开始重新排起。代码:/** Author: illuz * Blog: http://blog.csdn.net/hcbbt* File: a.cpp* Create Date: 2013-09-08 12:31:36* Descripton: simulate *原创 2013-09-08 22:33:41 · 1859 阅读 · 0 评论 -
UVALive 2326 Moving Tables 贪心
题意:你有几个搬东西的任务,从一间教室到另一间需要10分钟,但是在此期间,你需要经过的走廊不能又其他任务占用,求最短时间。教室分布如下:很明显的贪心,其实就是找出最少有几个不相交区间就可以了,循环找出来,复杂度为O(n^2),这样是可行的,因为数据量不是很大,只到200。但是如果数据量大点就会超时了,于是我想了个o(nlogn+n)的办法,排序后遍历一遍,拿个数组记录每一组不相原创 2013-09-07 15:50:28 · 1318 阅读 · 0 评论 -
HackerRank Algorithms-Search-Flowers 贪心
题目点此题意:K个小伙伴买N个多花,老板很奇葩,不想买太多花,如果有人已经买过x朵花了,那么买下一朵花就要付x+1倍的价格。给出每朵花的价格,求最少花多少钱都把花买下。分析:每个小伙伴买花时肯定是先买原价贵的,不然就吃亏了是不是。所以贪心策略就是把价格排序下,先让每个小伙伴把一血献给最贵的那几朵花,每次都买剩下的花最贵的那几朵,这样就是最优的了。一遍遍历即可,复杂度为O(n)。代码原创 2013-09-07 10:54:39 · 1488 阅读 · 0 评论 -
HackerRank Algorithms-Search-Pairs 数组的固定差对数
题目点此糊里糊涂地就在HackerRank做了几题水题,姑且发出来吧。。。题意:给出n和k,然后给出n个数,求出数组里面两两数的差为k有几对。其中[N0 and K于是换种写法,遍历数组然后查询该数+k有没有存在,存在就累计+1,储存和查询用set实现,复杂度为log(n),总的复杂度是nlog(n),应该会快很多。代码: /* * Author: il原创 2013-09-07 10:38:27 · 2348 阅读 · 0 评论 -
UVALive 2322 Wooden Sticks 截木棍 排序+贪心
题意:给出n段木棍的首尾坐标,求出(两个坐标都)非降的木棍序列的最小个数。排序后模拟即可。代码: /* * Author: illuz * Blog: http://blog.csdn.net/hcbbt * File: uvalive2322.cpp * Lauguage: C/C++ * C原创 2013-09-07 10:24:23 · 1657 阅读 · 0 评论 -
UVA 108 Maximum Sum 最大连续子矩阵和
题意:给出n*n的矩阵,求出里面子矩阵的和的最大值。这题是最大连续子序列的应用,序列是一维的,矩阵是二维的,所以我们可以把矩阵转换为一维的来算。也就是枚举矩阵的连续几行的合并,这样就转换为一维的了,再用最大子序列的算法去求,更新最大值就可以了。代码: /* * Author: illuz * Blog: http://blog.csdn原创 2013-09-06 21:43:18 · 2942 阅读 · 0 评论 -
UVA 507 Jill Rides Again 最大子序列和
很裸的最大子序列和。具体算法分析见这里。代码: /* * Author: illuz * Blog: http://blog.csdn.net/hcbbt * File: uva507.cpp * Lauguage: C/C++ * Create Date: 2013-09-05 00:09原创 2013-09-06 21:37:17 · 2325 阅读 · 0 评论 -
UVA 10041 Vito's Family 求中位数 模拟
很水,就是找出一个数,让它与数组各数的距离和最小。很明显是中位数,模拟即可。代码: /* * Author: illuz * Blog: http://blog.csdn.net/hcbbt * File: uva10041.cpp * Lauguage: C/C++ * Create Date原创 2013-09-06 21:32:59 · 2036 阅读 · 0 评论 -
UVA 11129 An antiarithmetic permutation 非等差数列 贪心 递归
题意:给出n,让你把0,1,2,3...n排序,使其的子序列(>=2)都是非等差数列。额,这边有个trick,只要对序列按奇偶位置分成两个序列,然后对两个子序列同样进行分类,最后排出来的一定是非等差数列。代码: /* * Author: illuz * Blog: http://blog.csdn.net/hcbbt * File:原创 2013-09-06 21:28:41 · 2006 阅读 · 0 评论 -
UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY。纯暴力是会超时的,所以得另辟蹊径,用分治算法。递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中的一块中,就会存在于跨越中线的点对中。查找跨越中线的点比较麻烦,之前已经求出两块中的最小距离,只要在x范围在[m-d,m+d]的点中找对,更新最小距离,最后返回最小距离即可。代码: /原创 2013-09-04 21:28:16 · 3839 阅读 · 0 评论 -
UVA 10718 Bit Mask 贪心+位运算
题意:给出一个数N,下限L上限U,在[L,U]里面找一个整数,使得N|M最大,且让M最小。很明显用贪心,用位运算搞了半天,样例过了后还是WA,没考虑清楚。。。然后网上翻到了一个人家位运算一句话解决了 = =....ORZ...人家的分析:(by天然呆大神)儘量讓 N 中為 0 的位元,M 為 1;N 為 1 的位元, M 為 0。因此從高位往低位檢查,如果 N 為 1(M 儘量原创 2013-09-04 11:20:42 · 2060 阅读 · 0 评论 -
UVA 10716 Evil Straw Warts Live 回文数 贪心
题意:给出一串字符串,每次交换相邻的两个字符,求到达回文串的最少交换次数。每次找最外面的两个字母,如果相同就向内缩进判断,如果不同,就找到里面能够让两边相同的最近的字符,进行交换,然后向内缩进判断。调了挺久,以后一定要把算法搞清楚再敲。。。代码: /* * Author: illuz * Blog: http://blog.csdn.n原创 2013-09-04 01:09:45 · 1834 阅读 · 0 评论 -
UVA 11100 The Trip, 2007 贪心(输出比较奇葩)
题意:给出n个包的大小,规定一个大包能装一个小包,问最少能装成几个包。只要排序,然后取连续出现次数最多的数的那个次数。输出注意需要等距输出。代码: /* * Author: illuz * Blog: http://blog.csdn.net/hcbbt * File: uva11100.cpp * Laugu原创 2013-09-03 16:53:00 · 2580 阅读 · 0 评论 -
UVa 10400 - Game Show Math 游戏中的数学 dfs+判重
题意:给出一些数字和一个目标数字,要求你在数字间添加+-*/,让表达式能达到目标数字,运算符号的优先级都是一样的。由于数据量很大,本来想用map判重的,结果还是超时了,然后发现彻底的把题意理解错了,我以为数字的位置可以变,还用了全排列,结果人家没说能变换顺序。。。修改后还是超时了 = =。。。果然map是行不通的,太耗时了,由于答案在[-32000,32000]之间,而你到达某一个位置原创 2013-09-01 23:52:40 · 1688 阅读 · 0 评论 -
UVA 10020 Minimal coverage 区间覆盖问题 贪心
题意:给出M,以及多个区间,求能覆盖[0,M]的最少的区间。小白上以及给出了很好的思路了。但是实现起来卡了卡了好久,果然若菜编码能力是硬伤啊 orz。。。用递归实现的,回头研究别人做法去。。。代码: /* * Author: illuz * Blog: http://blog.csdn.net/hcbbt * File:原创 2013-09-01 16:58:16 · 1406 阅读 · 0 评论 -
UVA 993 Product of digits 数字之积 贪心水题
题意:求出一个数,各个位数上相乘的积等于所给的数。枚举2-9,如果找到一个数能整除那个数就枚举下一位,递归即可。代码: /* * Author: illuz * Blog: http://blog.csdn.net/hcbbt * File: uva993.cpp * Lauguage: C/C++原创 2013-09-01 00:58:55 · 1604 阅读 · 0 评论 -
NYOJ 45 棋盘覆盖 模拟+高精度
题意就不说了,中文题。。。小白上讲了棋盘覆盖,于是我就挖了这题来做。棋盘覆盖的推导不是很难理解,就是分治的思想,具体可以去谷歌下。公式就是f(k) = f(k - 1) * 4 + 1,再化解下就是4^0 + 4^1 + 4^2 + ... + 4^(n-1)。思路很简单,但是题目没想象中的简单,刚开始天真的用递归模拟了下就交上去,立马wa掉。。。发现即使用Long long类原创 2013-08-31 21:40:41 · 1553 阅读 · 2 评论 -
UVA 11054 Wine trading in Gergovia 葡萄酒交易 贪心+模拟
题意:一题街道上很多酒店,交易葡萄酒,正数为卖出葡萄酒,负数为需要葡萄酒,总需求量和总售出量是相等的,从一家店到另外一家店需要路费(路费=距离×运算量),假设每家店线性排列且相邻两店之间距离都是1,求最小路费。在纸上模拟了一下,你会发现一家店如果卖酒,它的最终流向就是向两边运送;如果买酒,那它就在那边等别家店送酒过来。(我在废话。。。)然后第一家店肯定是向右边运酒了,最小的运费当然原创 2013-08-30 20:18:44 · 4265 阅读 · 0 评论 -
UVA 10954 Add All 全加一起 模拟+贪心+优先队列
题意:规定每次加法的运算量为加法的和,给你n个数,要你全部加起来,尽量让运算量为最小。要让运算量最小,只要每次找最小的两个数加起来就行了,之后得把和放回数组重新排序。数据量为5000×100000,5e+8,用int是可以的,但是我刚开始果断用的long long,然后A掉之后改成int型,顺便把cout改成printf,结果慢了3ms,还以为是cout在拖慢速度,网上查了一下,发现cou原创 2013-08-30 19:30:23 · 2200 阅读 · 0 评论 -
UVA 10714 Ants 蚂蚁 贪心+模拟 水题
题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间。模拟一下,发现其实灰常水的贪心。。。不能直接求最大和最小的= =。只要求出每只蚂蚁都走长路下木棍时的最大值,和走短路时的就行了。代码: /* * Author: illuz * Blog: http://blog.csdn.net/原创 2013-08-29 23:27:23 · 2122 阅读 · 0 评论 -
UVA 311 Packets 贪心+模拟
题意:有6种箱子,1x1 2x2 3x3 4x4 5x5 6x6,已知每种箱子的数量,要用6x6的箱子把全部箱子都装进去,问需要几个。一开始以为能箱子套箱子,原来不是。。。装箱规则:可以把箱子都看成正方体,装在6x6的盒子里。典型的贪心题。思路:(参考了Starginer大神的)①每个6*6的都占一个箱子。②每个5*5的放在一个箱子里,同时里面还能装11个1*1的。③每原创 2013-08-29 20:55:32 · 2702 阅读 · 0 评论 -
NYOJ 422 字串和之差
题目虽然是中文的,但说的不是很清楚,求的是连续子序列和的绝对值的最大值和最小值,然后求两个绝对值的差。刚开始还以为是最大连续子序列和的问题,发现不一样,想了一会样例,然后看了discuss后才理解了题意 = =。分析:这题考察的是对前n项和的理解,因为要求连续子序列和,某连续子序列和[a,b]其实就是前b项和-前a-1项和的差。而求最大值最小值就是求前b项和与前a-1项和的差最小,原创 2013-08-29 20:03:30 · 1703 阅读 · 0 评论