![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 74
kornberg_fresnel
The most difficult thing in your life is to know yourself.
展开
-
最小生成树的Prim和Kruskal算法
一、Prim算法1.算法原理:和Dijkstra算法非常相似,都是从某个顶点开始,通过将边添加到新的集合中去。此算法添加边的原则描述如下:设新的节点集合为V,由新的节点集合确定的边集为E = { (i, j) | i, j ∈V } (当然这些边构成的图是一棵树),每次将与V集合相连的点的不在E集合的最小边添加到E中去,同时将相连的点添加到V中去,在这个过程中,从原来的图中删除点和边。原创 2016-02-15 10:41:00 · 379 阅读 · 0 评论 -
POJ 1328 Radar Installation
POJ 1328题目大意如下:给出N座小岛的坐标,以及灯塔的观察半径,需要建造最小数目的灯塔,使得所有的小岛都能在灯塔的观察范围之内这个问题可以换角度思考,因为已经知道小岛的坐标以及观察半径,所以可以算出以小岛为圆心,观察半径为半径的圆与海岸线的交点的横坐标,同时对每一个这样圆,记录酸楚的以两个横坐标(可以相等,也可以不相等)为上下限的区间,然后暴力穷竭解决:#include原创 2016-02-26 20:58:17 · 330 阅读 · 0 评论 -
POJ 3091 Stall Reservation
POJ 3091题目大意如下:农场主有N头牛,每头牛对于自己的供奶时间非常挑剔,只在固定时间内的某个空的隔间供奶。但是农场主有不能无限制的给每头牛分配供奶隔间,所以需要通过设计程序来求出一个最优的方案,使得使用最少隔间满足所有奶牛的要求。这是一个区间问题,问题给定每头牛的产奶时间段,首先可以根据每头牛的产奶时间段的下限优先排序(如果下限相同,再考虑上限)。之后在寻找最优方案的过程中,则可以原创 2016-02-27 14:39:06 · 473 阅读 · 0 评论 -
最长上升子序列(LIS)POJ 1631 Bridging Signals
POJ 1631题目大意如下:给定N个测试,每个测试的数据:第一行输入P,表示有P个连接,接下来的P个数据是按照下标从1到P排列的,每个下标i对应一个连接数a[i],表示i和a[i]是连接的,生动点就如下图所示,问题要求给出一个数字,表示的是在这P个连接数里,没有互相交叉的最大组合数。从上图看的话,其实只是有助于理解题目意思,但是要解决问题的话,这个图还是会带来干扰。肯定不原创 2016-03-12 19:10:07 · 496 阅读 · 0 评论 -
POJ 2393 Yogurt Factory
POJ 2393题目大意如下:这是一个费用问题,实际背景是生产酸奶,工程分为N周,指定每周存储酸奶的费用为S,给出每周的单位酸奶制造成本以及客户需求量,要求给出最佳的生产方案,使得总的花费最少。可以使用一个二维数组,分别存储原定该周的酸奶制造成本,以及涮选后的酸奶制造成本,关于涮选后的酸奶制造成本可以这样涮选:与前一周的新的制造成本做比较 if (exp[i][0] >原创 2016-02-27 16:49:41 · 425 阅读 · 0 评论 -
设置优先级 POJ 1065 Wooden Sticks
POJ 1065题目大意如下:给出N段木头的数据,每段木头的数据表示形式为:(L,W)。表示的是木头的长度和质量,但是有一个要求(题目我也没有看太懂==,只解释一下大致意思),如果前一段木头数据的字典序小于之前的木头数据,就会花费一些时间。现在给出一些木头的数据,要你给出一个方案,使得花费的时间最少。这个题目其实很简单,书上布置的这个作业要求用DP方法,但是今天做这个题的时候,并没有想出D原创 2016-03-12 19:30:59 · 317 阅读 · 0 评论 -
POJ 1017 Packets
POJ 1017题目大意如下:有1*1、2*2、3*3、4*4、5*5、6*6这六种型号的包装盒,也指定了相对于这六种型号的产品的分别的数量。由于物流运送费用是和运送商品的数量成正比的(商品运送的时候是包装在包装盒里的),为了节省物流开支,需要确定一种最佳的包装方案,即:使用最少数量的包装盒。简单的贪心,具体分析如下:1)都使用6*6的包装盒;2)如果一个包装盒里包装的是6*6原创 2016-02-29 11:26:42 · 317 阅读 · 0 评论 -
最短路POJ 3268
POJ 3268题目大意如下:有N头牛分布在N个农场,现在有一头X农场的牛要举办party,那么其他农场的牛都会去参加。其中N最大为1000,农场和农场之间存在一些单向路径,路径的条数M最大为100000。如果每头牛都走最短路径(算上来回,也就是从它的农场到X农场,再从X农场回到自己农场),那么这些最短路径中最长的路径是多少?这里涉及到的是任意两点间的最短路径,1)一开始想到的是war原创 2016-03-25 09:14:37 · 537 阅读 · 0 评论 -
POJ 3040 Allowance
POJ 3040题目大意如下:(最近做的题总是FJ和他的奶牛。。。)FJ想给他的奶牛奖赏,准备的奖金分成N组,每周发给奶牛的奖金不能少于C,每一组都是同一种面值的硬币,同时还告诉了每一组硬币的数量。现在要去寻找一种最佳方案,使得能够最大周数分发奖金。还有一点(最近看题总是丢三落四):从最小面值到最大面值,前一面值能够整除后一大的面值。关于题目给出的这个整除关系,开始没有看到,折磨了半天原创 2016-02-29 23:55:41 · 703 阅读 · 0 评论 -
POJ 1862 Stripies
POJ 1862题目大意如下:舍去题目背景,意思就是:给出一组数,通过不断进行两数之间的运算2*sqrt(m1*m2)来得到最终的结果,现在要求得到的结果最小,请选择一个最优的方案。这是一个非常简单的贪心,为了保证得到的数最小,肯定每次都要把最大的两个数进行运算,使得这组数的最大值不断下降,这样得到的最终结果就是最小值。不知道是什么原因,这题写的算法没有任何问题,但是却wrong了一次原创 2016-03-01 10:46:38 · 369 阅读 · 0 评论 -
最小生成树-Kruscal-POJ 1258 Agri-Net
POJ 1258题目简单,背景忽略,就是直接裸露的使用kruscal方法求最短路。虽然简单,但是深深的体会了这个题目的恶意,简直了。。。就是如下的代码:for (int i = 0; i < k; i++) { int x = edge[i].s, y = edge[i].e, w = edge[i].cost; int tx = findRoot(x), ty = findR原创 2016-03-25 15:35:30 · 355 阅读 · 0 评论 -
矩阵快速幂
矩阵快速幂在动态规划,快速计算矩阵有着非常重要的作用,可以很大程度上减少计算消耗的时间。它的实质其实就是:矩阵计算+快速幂。1.矩阵乘法对于矩阵A*B,要遵循的是A的列数要等于B的行数,其他要求没有:#include #include #include #include #include using namespace std;const int M = 10000;t原创 2016-03-15 16:23:35 · 302 阅读 · 0 评论 -
字符串匹配的KMP算法(不建议大家看,这里是我的暂时笔记)
做个记录:#include #include #include #include using namespace std;const int maxn = 1000;int Next[maxn];string pattern, target;void produceNext() { int i = 0, j = -1, len = pattern.length();原创 2016-04-17 00:05:55 · 376 阅读 · 0 评论 -
选择算法-在线性时间内选择任意第几个小(大)的数
给定一组随机数,然后在O(n)的时间内计算出它的第i小的数,想法是结合快排,但是每次只是计算单边,代码如下:#include #include #include #include #include using namespace std;int A[30] = {0};// initialize the array:Avoid init_arr() { puts("---原创 2016-08-18 14:51:20 · 470 阅读 · 0 评论 -
算法导论习题(9)
练习(持续更新...)9.3-3 假设所有元素都是互异的,说明在最坏情况下,如何才能使快速排序的运行时间为O(nlgn)?快速排序的最坏情况就是选取的主元要不是当前范围的最大值,要不就是最小值,只有避免这种情况,才能够使得快排达到期望值。之前有写过一个在O(n)复杂度等级的随机选择,目的是可以在O(n)内计算出指定第几个最小或者最大的值。这里可以借鉴:1)先计算出中位数,将中位数和原本原创 2016-08-18 19:51:13 · 1052 阅读 · 0 评论 -
算法导论习题(10)
10.2-8 说明如何在每个元素仅使用一个指针x.np的(而不是通常的两个指针next和pre)情况下实现双向链表,假设所有的指针的值都可以视为k位的整型数,且定义x.np = x.next ^ x.pre,即 x.next 和 x.pre 的异或,(NULL的值为0)注意要说明获取表头所需的信息,并说明如何在该表上实现SEARCH、INSERT、DELETE和REVERSE,REVERSE要求时原创 2016-08-21 21:33:23 · 460 阅读 · 0 评论 -
Codeforces 808D 数组分割
题目大意给定一个只有正整数组成的数组,判定是否能够只通过一次数字替换来保证能够找到一个合适的分隔位置来使得被分割出来的两半数组,它们分别的和相等。 题目链接见此:Codeforces 808D这个问题可以抽象成一个确定的前缀数组加上或者去掉一个数字,定义数组:pre[i]pre[i] 定义一个记录 [0,i)[0, i) 的数组和,σ\sigma 表示在可以二分数组和的情况下的二分和,kk 表示在原创 2017-06-20 22:39:43 · 337 阅读 · 0 评论 -
Codeforces 830A, Binary Search
题意:简单并抽象的说,现在有一根直线,上面某个坐标 pp 标记了办公室所在的位置,同时有 nn 个坐标标记了 nn 个人的位置,以及 kk 个标记了钥匙的位置。现在这 nn 个人都想进入这个办公室,但是进入的前提是需要有钥匙,但每个人只能有一把钥匙,所以如果某个人的位置没有钥匙的话,他需要走到某个有钥匙的位置拿到以后进入办公室。所有的人可以同时行动,数量上满足如下关系:1≤n≤1031 \le n原创 2017-07-21 00:43:52 · 400 阅读 · 0 评论 -
POJ 2376 Cleaning Shift
POJ 2376题目大意如下:有N头牛要在指定的T时间以内工作,但是每头牛的工作时间区间给定了,同时在1~T这T个小时里面,每个小时都至少得有一头牛在工作,如果这种情况不恒成立,那么输出“-1”说明没有解决方案,否则,给出最佳解决方案:使用最少牛的头数观察到问题的规模并不大,所以可以用暴力搜索来做,但是要注意的一点是:在对这N头牛按照它们的工作时段来排序之后(我的排序是按照先排下限,在下限原创 2016-02-26 20:32:53 · 556 阅读 · 0 评论 -
POJ 3050 Hopscotch
POJ 3050题目大意如下:这也是一道暴力搜索,直接DFS,代码如下#include #include #include #include using namespace std;int dirX[] = {0, 1, 0, -1};int dirY[] = {1, 0, -1, 0};int Grap[6][6];int sum;map data;void df原创 2016-02-26 20:27:43 · 397 阅读 · 0 评论 -
POJ 3187 Backward Digit Sums
POJ 3187题目大意如下:一种智力游戏,给出一个数finalSum和自然数N,前者表示通过游戏规则得到的和,后者表示最开始一层可以使用的1~N这几个数N最大可以到10,想到10!规模太大,所以一开始没有想到暴力,但是问题给出的条件太少,所以还是往暴力方向考虑,这种做法自己现在想还是有漏洞,如果不是测评系统给出的数据比较可以的话,1000MS以内应该完不成,以下是代码:#includ原创 2016-02-26 20:20:05 · 425 阅读 · 0 评论 -
Bellman-Ford Algorithm and Dijkstra Algorithm
最近在看《挑战程序设计竞赛》,边看边整理一些知识,这篇内容是有关最短路径的几个主要的算法:Bellman-Ford Algorithm、Dijkstra Algorithm、Floyd-Warshall Algorithm前两者主要是针对单源最短路问题,后者用来解决任意两点之间的最短路径以及求传递闭包问题的1.Bellman-Ford Algorithm这个算法的原理可原创 2016-02-13 23:46:39 · 493 阅读 · 0 评论 -
POJ 3176 Cow Bowling
POJ 3176题目大意如下:这里做个抽象,问题背景就省了:有一个三角数堆,从顶点开始加和,找出一条从顶点到底边的最大和路径,求出这个和。十分简单的Dynamic Programming,可以抽象成:dp[i][j] = value[i][j] + max(dp[i + 1][j] + dp[i + 1][j + 1]);从上面式子可以看出,其实对于dp数组而言,第一维是没有必要的原创 2016-03-02 22:24:53 · 287 阅读 · 0 评论 -
POJ 3262 Protecting the Flowers
POJ 3262题目大意如下:还是关于Fermer John 和他的奶牛的故事,FJ有一个花园,里面种了很多花。每天FJ会带牛在外面吃草,牛群回来之后,在FJ不注意的时候会吃掉花园里的花,所以FJ需要把牛群运到它们的牛棚里去。每次只能运送一头牛,给出了运送每头牛所花的时间和每头牛能够每单位时间吃掉的花的数量,现在要求给出一个最优方案,使得FJ损失的花数量最少。一开始想的太简单,看到题目给出原创 2016-03-01 11:47:06 · 426 阅读 · 0 评论 -
POJ 229 Sumsets
POJ 2229题目大意如下:要求将一个正整数分解成2的指数幂的形式,问这样的分解有多少种方式。这本来是一个很简单的Dynamic Programming,但是有时候算法题写多了似乎会忘记最初的最基本的想法(其实还是自己不太熟练)。记住DP的一个非常基础的要求,而且这个要求还是和递归相似的:要求原问题,其实就是对子问题求解,但是这里的子问题不是每次都要求你的知道,也许只要知道最最最初的解就原创 2016-03-02 22:33:26 · 450 阅读 · 0 评论 -
POJ 2385 Apple Catching
POJ 2385题目大意如下:(这个题,去年学院选拔考试考过,然而并不会做,今天又遇见,煎熬两小时。。。)FJ的牛喜欢吃苹果,有两棵苹果树,每隔一分钟,有且仅有一棵苹果树会掉下一个苹果,不计牛的运动时间,算出牛最多能吃多少个苹果(限定了牛在两棵树之间的最大移动次数)。典型的DP问题,之前想过DP树,但是之后不知道怎么化简,转而考虑状态方程。对于第i分钟牛的第j次移动有以下规律:1)原创 2016-03-03 13:54:41 · 399 阅读 · 0 评论 -
POJ 3616 Milking Time
POJ 3616题目大意如下:又是FJ和他的牛,FJ给牛指定了产奶时间段,每个时间段内,牛在不停的产奶,当这个时间段完结后,牛需要R时间休息。给出M个时间段,和指定的间隔休息时间,以及每个产奶时间段产奶数量,求产奶的最大值。终于自己AC了一个dp,但是还是wrong了两次(不细心,把M当成了R)。简单dp的基本就是写出状态转移方程,dp数组对应0到第j段产奶时间短的最末时间,表示整个区间,原创 2016-03-03 16:07:57 · 320 阅读 · 0 评论 -
计算几何+并查集处理:POJ 1127 Jack Straws
POJ 1127题目大意如下:有n根小棍分布在一个二维平面上,每根小棍标记了它两端的坐标,小棍的序号是从1~n,现在的问题是:给出任意两根小棍的序号,问它们是否是相连的。这里相连的定义是:可以直接相连(相交),或者通过若干根其他小棍间接相连。不能直接去研究两根小棍的相交情况(比如直接去求它们的交点坐标),可以考虑向量。在向量里面,假设向量P1 = S1 - T1,P2 = S2 -原创 2016-03-17 09:59:15 · 499 阅读 · 0 评论 -
动态规划-POJ 3666 Making the Grade
POJ 3666题目大意如下:给出N个土堆的高度,现在知道对每个土堆的高度作修改,不管是增高土堆的高度还是减少土堆的高度,其花费都是一样的,改变了H高度,就会产生H的花费。现在要求是的土堆的高度呈现一个单调的变化趋势,设计方案,求出最小的花费。第一考虑是使用DP,然而DP数组的设置又是一个问题,还是从原来的问题着手:对于每个单独的土堆i来讲,它的最大允许高度不是等于i-1就是等于i+1原创 2016-03-17 18:15:28 · 571 阅读 · 0 评论 -
多重背包-POJ 2392 Space Elevator
POJ 2392题目大意如下:FJ的牛想上天,但是要借助梯子,现在有K种梯子,由于会收到宇宙射线的影响,所以每种梯子限定了能够到达的最大高度。给出K种梯子的单位长度、数量、以及允许到达的最大高度。现在要求给出一个最优方案,使得使用这K种梯子到达最大高度。还是DP,定义dp[i][j]:表示使用前i+1种梯子是否能够到达高度j。之前自己都没有意识到这是一个多重背包问题,所以写了个比较烂的原创 2016-03-17 22:09:42 · 352 阅读 · 0 评论 -
SPOJ-Problem GCJ1C09C
这是一个非常棒的dynamic programming问题,原题的链接在这里:SPOJ Problem GCJ1C09C题目的大致意思如下:一个监狱里有P个并排的牢房,从左至右依次编号为1,2,...,P。最初所有的牢房里面都有一个犯人。相邻的两个牢房之间又一个窗户,可以通过它与相邻牢房里的囚犯对话。现在要释放一些囚犯。如果释放某个牢房里的囚犯,其相邻的牢房里的囚犯就会知道,因而会发生暴动原创 2016-02-19 16:39:04 · 690 阅读 · 0 评论 -
POJ 3669 Meteor Shower
POJ 3669题目大意:Bessie知道接下来会有一场流星雨,流星雨撞击地面时会爆炸,爆炸影响的范围除了撞击点还有与该点直接相连的4个点,比如撞击坐标是(X,Y),那么以下(X+1,Y),(X-1,Y),(X,Y-1),(X,Y+1)都会受到影响,而且这些地点之后就不能有人在上面。Bessie想要逃离这场流星雨,现在知道有M颗流星将在300*300的区域内撞击地面,而且还知道这M颗流星撞击的原创 2016-02-20 15:11:57 · 470 阅读 · 0 评论 -
POJ 3181 Dollar Dayz
POJ 3181题目大意如下:给出一个正整数N,并指定只能在1到K的范围内,使用这K中整数将N分解,问分解的方式有多少种。如果按一般的方法来想,我们可以这样定义表达式:dp[i][j]表示使用前i种数来组成j的方法数,那么就有dp[i + 1][j] = Sigma(0, min{j, n(i + 1)})dp[i][j - k]。但是这样算的话,就会是这样:for (int i原创 2016-03-06 23:51:09 · 294 阅读 · 0 评论 -
POJ 3046 Ant Counting
POJ 3046题目大意如下:指定蚂蚁家族有T个,每个家族的蚂蚁数量最多为100只,最少当然为1了,总共有A只蚂蚁,每只蚂蚁唯一的区别就是它所对应的家族编号,相同编号的蚂蚁看成没有差别。现在将这些蚂蚁分成不同的集合,指定每次分割是的集合大小(每次分割出来的集合大小都是统一的)。现在指定集合大小的范围,求出对于不同集合大小的分割方法的总和。这是一个递推问题当然也是DP,所以重要的不是自己去模原创 2016-03-07 00:13:55 · 464 阅读 · 0 评论 -
01背包问题-POJ 2184 Cow Exhibition
POJ 2184题目大意如下:背景就不介绍了,就是给出N组数,每组数有两个标准,都是整数。现在要求给出一个方案,求出从这N组数中摘取一部分,使得这一部分的两个标准的和最大,而且还要满足两个标准分别的和不能小于零。隐约觉得这是一个背包问题,开始比较难看出问题,最开始我的解决方案是:区间最优的叠加。也就是说定义dp[i][j]表示区间[i, j)内的最优方案,而且保证dp[i][j]的s和f都原创 2016-03-18 17:32:26 · 345 阅读 · 0 评论 -
Codeforces 651A Joysticks
Codeforces 651A Joysticks题目大意如下:有两个游戏棒,开始各含有charge[0]和charge[1]的电量,都大于0。现在要使用这两个游戏棒玩游戏,但是如果其中只要有一个游戏棒没有电(也就是0)那么游戏就没有办法进行下去。现在知道只有一个充电口,而且充电只能在每分钟的开始阶段,每分钟可以充入1%的电量,然而玩游戏每分钟会消耗2%的电量(只能一个在充电,一个在玩)。现在原创 2016-03-21 12:35:34 · 376 阅读 · 0 评论 -
线段树学习笔记
本文笔记在参考一步一步理解线段树-tenos的基础上形成:线段树,也是二叉搜索树的一种,是基于数组,但是优于数组的一种数据结构。同时结合预处理(时间复杂度一般在O(n))使得从原来数组的O(n)的查询和更新复杂度降到了O(logn),在处理很大数据量的数据更新和查询最值方面变得简单,值得一提的是,它的构建也很简单。这里从最小值的问题讨论(一般,线段树用在查询最值比较方便)1.构建线段树:原创 2016-03-11 15:11:39 · 350 阅读 · 0 评论 -
POJ 2104 K-th Number
POJ 2104题目大意如下:给定N(N 如果单纯的使用排序,对于5000次询问,这样花费的时间比较多。这里采用平方分割的方法,那么可以在O(n^0.5)的时间内完成。大方向是使用另外一个N容量的数组存储对原来数组的升序情况,然后采用二分法,每次选取一个数,根据这个数在(i,j)区间的位置情况,进而选出真正的第k个数。1.假设X是第k个数,那么一定有:1)在询问区间内,不超过X原创 2016-03-10 22:57:04 · 349 阅读 · 0 评论 -
KMP算法到底在干什么
在写这篇文章之前参考了两篇文章,觉得写得很好,尤其是阮一峰写的KMP算法。 KMP算法的关键是它的next数组,利用next数组能够高效地确定在当前失配的情况下,应当将模式串移动多少位才能够避免不必要的匹配。不必要的匹配 如图,如果当前目标串与模式串在D处发生失配,传统方法是从模式串的开头位置重新移动,直到开头位置能够找到匹配的字符然后重新开始下一个匹配流程。但我们注意到在D发生失配之前的AB是原创 2017-09-16 11:17:04 · 9466 阅读 · 3 评论