自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(19)
  • 问答 (1)
  • 收藏
  • 关注

原创 POJ2155 Matrix(经典二维树状数组)

题意:给出一个矩阵,其中的元素要么是0要么是1,现在有两种操作,一种是将一个子矩阵内的元素全部反转,一种是查询元素(x,y)对应的值。要点:这题是非常经典的一道二维树状数组题,难点是怎么修改子矩阵内的值,其实只要每次修改(x1,y1),(x1,y2+1),{x2+1,y1},(x2+1,y2+1)这四个点的值即可。主要思路可以参考这个论文:点击打开链接这个论文里有点说的不是很清

2016-08-31 10:53:51 470

原创 二维树状数组

刷cf的时候做到一道题,让求矩阵中任意一个子矩阵的元素之和,当时看了一下别人的题解,发现跟树状数组有点像,然后查了一下果然是树状数组,不过是二维的。这里就总结一下二维树状数组的过程。问题:一个由数字构成的大矩阵,能进行两种操作 1) 对矩阵里的某个数加上一个整数(可正可负) 2) 查询某个子矩阵里所有数字的和,要求对每次查询,输出结果。求任意子矩阵可以由sum(x2, y2)

2016-08-30 21:49:16 427

原创 例题5-7 UVa136 Ugly Numbers(STL:priority_queue)

题意:看白书要点:很简单的priority_queue应用题。之所以写个博客是为了总结一下priority_queue的写法。主要问题是VS中greater不是模板,但OJ中可以AC。需要特殊排序可以有以下两种写法:struct node{ int x, y;};struct cmp{ bool operator()(node a, node b) { ret

2016-08-28 16:57:00 604

原创 例题5-3 UVa10815 Andy's First Dictionary(STL:set&&sstream的应用)

题意:输入一长串字符串,将其中的单词按字典序输出。要点:STL中的set就像数学中的集合,每个元素最多只出现一次。ssteam可以很简单的将字符串转换为整数或反之。这题注意将所有不是字母的字符变成空格再进行一次出入流操作来除掉空格。#include#include#include#includeusing namespace std;set dict;int mai

2016-08-27 21:25:39 499

原创 例题5-2 UVa101 The Blocks Problem(STL:vector)

题意:看白书要点:学了一下vector中的resize()的用法,就是把resize(n),n及以上的都丢掉。这道题的归位的意思是放回对应的第i个堆。#include#include#include#includeusing namespace std;int n;vector pile[30];void FindPile(int a, int &p, int &h

2016-08-26 22:23:02 855

原创 红黑树的实现

学了一下算法导论上的红黑树,这个数据结构基于二叉搜索树,二叉搜索树有一个缺点:如果数据以递增的顺序插入,得到的树深度就是n,进行操作就很不方便。红黑树就是在此基础上完善,自己可以自平衡,使两边始终保持接近,这样时间复杂度就降到O(lgn)。这个数据结构的确很难,插入和删除这两种操作非常复杂,自己按照书上给的伪代码实现了一下,思路是基本理清了,这种太复杂的数据结构想完全记住是不太现实的,能够掌握要点

2016-08-24 22:25:21 318

原创 POJ1149 PIGS(最大流)

题意:有m个锁着的猪圈,现在有n个顾客过来买猪,他们手里分别有对应猪圈的钥匙,如果已经开了对应的猪圈,就可以在把这个猪圈的猪赶到其他猪圈去,要求能卖出最多的猪数。要点:这题建图比较困难,建完图就是个最大流模板。另设一个源和一个汇,将顾客作为其他节点,将猪圈开启的次数作为边,这样先将源点与每个猪圈的第一个顾客连接,如果这个顾客也开了其他猪圈,将猪圈的猪数叠加,这样就构成了一个图,然后接下

2016-08-21 09:55:15 375

原创 最小费用最大流问题

最小费用最大流就是在原来求最大流的基础上,假设每条边还有一个单位流量所需要的费用,因为最小费用的出现,原本的平行边变得有意义,并且允许反向增广,基本上就是将原本BFS改为进行一次BellmanFord算法寻找最短路径,只要初始流是该流量下的最小费用可行流,每次增广后的新流都是新流量下的最小费用流。下面POJ2135的题解:题意:从起点出发,走到终点再回到起点,每条边都对应一个时间,求所需的

2016-08-18 18:54:19 6010

原创 最大流的Edmonds-Karp算法

最大流一般可以解决像货运这种问题,例如POJ1273,一共n个池塘m条边,给出每条边能通过的最大水流量,给出一个起点和一个汇点,问起点流出的最大水流量是多少。基本算法是Ford-Fulkerson算法:循环增加流的值,每次寻找一个增长路径(从起点到汇点的简单路径),每次将路径中最小的残余边量(容量减当前流量)加入流量,同时更新残余边和它的反向边,直到图中没有增长路径,此时的流即为最大流。增长路

2016-08-16 16:34:28 1078

原创 POJ1328 Radar Installation(贪心)

题意:x轴下部是陆地,上部是海洋,现在海洋中有一些岛屿,要求在陆地上建一些半径为d的雷达,使所有岛屿都能被扫描到,求最少建几个雷达。要点:基本思路是:雷达当然是建在x轴上可以扫描到最大的范围,所以从每个岛屿的坐标作半径为d的圆,可以在x轴上截取一个区间,按照这些区间的左短点从小到大排序,求最少几个不重复的区间。这里与活动选择问题有些不同,如果一个区间的左端点大于当前的右端点,那么自然这

2016-08-15 10:12:20 294

原创 POJ1323 Game Prediction(贪心)

题意:m个人每人n张牌,每张牌的点数都不同,每轮每个人出一张牌,求最少能赢几轮的最大值。要点:很简单的贪心思想,因为问最少能赢几轮,所以假定自己出牌如果不是当前最大值,一定用人出比自己大的牌,这样只要将牌面从大到小排序,从大的开始出牌,与总共的牌进行比较,看有几张牌大于当前牌,再减去已经其中已经出过的牌,如果值为0就说明此轮能赢,如果不能赢就需要耗费一张大牌。159

2016-08-14 09:22:39 389

原创 POJ1700 Crossing River(贪心)

题意:经典的过河问题,一群人要过河,只有一艘船,船最多坐两个人,船速为两人中较慢的那个,问把所有人都运到对岸最少要多长时间。要点:这题自己想真挺难,看了一下网上的方法,基本上是这样,当人数n=1,2,3时,最小时间是固定的,而n大于3时,可以先考虑把最慢的两个人运过去,有以下两种方法:一:用最快的人先把最慢的运过去,再自己划船回来,再把次慢的运过去,再自己回来;二:最快的和次快的先划船

2016-08-12 19:33:08 299

原创 活动选择问题(贪心)

假设有n个活动,每个活动有一个起始时间和一个结束时间,现在想在一段固定时间内安排最多的活动数。这个问题是典型的贪心问题,我们把所有的活动按结束时间从小到大排序,这样可以知道最小的那个活动a1一定在最优集合里,因为假设最优结构中没有a1,而是它的最小活动为另一个数假设ax,因为a1是所有活动中最小的,所以如果我们把ax换成a1,最优集合里所有的活动还是兼容的,所以a1一定在最优集合中。这样我们只要先

2016-08-09 22:38:52 871

原创 最优二叉搜索树

最优二叉搜索树,又称霍夫曼树,是一种使查找时间尽可能小的算法。已知一个节点的出现概率以及它的深度,它的总查找时间就是深度*概率,现在希望经过排列使所有节点的查找时间最小。基本思路是区间dp,两个边界中间任选一个根节点,拆分成两个子树。下面是算法导论上关于一个期望搜索的实现。#include#includeusing namespace std;const int n = 5;

2016-08-08 21:31:58 781

原创 POJ2184 Cow Exhibition(DP:变种01背包)

题意:一群奶牛分别有s和f两个值,要求选出一些奶牛使s与f的和最大并且s和f分别的和不能为负数。要点:用dp[i]=j表示当s的和为i时f的和为j,这样最后只要求dp[i]+i的最大值即可。注意这题因为有负数,所以引入一个偏移量。这里01背包是用一维表示的,所以要根据s[i]的正负分别处理,遍历是倒序还是正序主要考虑子结构不能被先更新。15913695S

2016-08-07 21:15:28 437 6

原创 POJ2677 Tour(DP:双调巡游)

题意:算法导论上的一道习题,给出一系列点的的坐标,现在从最左端出发,到达最右端的点,再返回原点,要求遍历所有点并且路程最短。要点:出发又返回可以看成两个人同时从左往右走,其中一个人走的快一个人走的慢。重点是因为一个点只能走一次,所以可以想出最优子结构,假设现在用dp[i][j]表示两个人分别走到点i和j的最短路径,下一步是走到i+1这个点,那么可能是位置为i的人走到,又或者是位置为j的

2016-08-06 08:20:00 877

原创 POJ1971 Parallelogram Counting(hash)

题意:给出一系列点的坐标,要求能组成几个不同的平行四边形。要点:思路很简单,找两个点的中点组成哈希表即可,我用链表写不是超时就是超空间,看来ACM还是尽量别用指针,用数组模拟链表可过。15878931Seasonal1971Accepted36868K704MSC++1103B2016-08-03 10:01:39

2016-08-03 10:11:46 441

原创 POJ1840 Eqs(hash)

题意:已知a1,a2,a3,a4,a5,求a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0有几个解。要点:跟hash其实关系不大,主要是移项,求a1x13+ a2x23+ a3x33=a4x43+ a5x33,这样只要三次循环即可,注意数组负数下标要加一个标准值。15873510Seasonal1840Accepted4

2016-08-02 20:08:56 310

原创 散列表的初步实现

看算法导论补了一下散列表,也就是hash表,hash表还是很好用的,兼顾了空间和时间,查找操作只要O(n/m),基本的难点在散列函数这里,全域散列这里看不太懂,初步敲了一下除法散列法和乘法散列法的实现,基本没啥好说的,看完开放寻址法以后找两道OJ题做做。#include#include#includeusing namespace std;const int hashnum = 7

2016-08-01 15:48:15 300

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除