摘要: STL中的所有算法(70个)参考自:http://www.cppblog.com/mzty/archive/2007/03/14/19819.htmlhttp://hi.baidu.com/dinglinbin/blog/item/887e7c30c12e429ba9018e30.html STL算法部分主要由头文件<algorithm>,<numeric>,<functional>组成。要使用 STL中的算法函数必须包含头文件<algorithm>,对于数值算法须包含<numeric>,<functional>中则定义了 阅读全文
posted @ 2011-05-10 22:45 枕边梦 阅读(4687) 评论(0) 推荐(0) 编辑
摘要: 悲剧呀,我怎么又理解错题意了,写了一个代码,固执的修改提交,都WA了俩次首先是一种贪心的思想,题意是要求利用table中给的商品利润和有卖出的期限,计算最大的获利,你可以认为是这样,一个时间只能售出一件商品,但题目中给你的是期限,不是具体哪一天卖出,(我的问题就在这里了),就是把能在期限之前卖出的商品卖出,累加利润,当然,只能在同一天卖出的商品,当然是选择其中利润最大的一件,所以,首先就要对商品的利润进行排序啦,也就是所谓的贪心,首先选择利润最大的,而且最晚卖出,所谓的最晚,就是在最接近期限,而且还没被占用的时间,这里说到了“占用”,也到了并查集出场了这里关于并查集的应用很巧妙,父节点记录的就 阅读全文
posted @ 2011-05-09 21:32 枕边梦 阅读(1099) 评论(0) 推荐(1) 编辑
摘要: 呵呵,这道题目的话,跟之前那道计算路径程度有点区别给你多个路径,让你求出哪些节点被作为最近公共祖先,并计算被作为最近公共祖先的次数首先,读入数据有点麻烦,按代码中那种方法,还蛮方便的其次就是,需要找出根节点,再进行深度优先搜索,这是很求路径长度唯一的区别,计算路径的时候,从任意节点开始,并不影响计算路径的长度但是,此题目中,我们要保证每一个最近公共祖先都是正确的,为什么这么说呢?因为,在计算路径的时候,其实只是一种相对的情况,即,这已遍历的节点中,相对的某个节点是最近公共祖先,没有一种严格性而此题就是要求最近公共祖先,所以必须先找出根节点,即入度为零的节点,这个也很好理解具体的,见之前的258 阅读全文
posted @ 2011-05-08 23:06 枕边梦 阅读(328) 评论(0) 推荐(0) 编辑
摘要: 今天效率还不错,再接再厉^-^总得来说,这道题目不难,但悲剧的是,我一开始理解错题意了题意:1)n个队列,n个立方体。 2)初始化时候每个队列有一个立方体。 3)两个操作:m x y:将x所在的集合放到y所在的集合里面,说白了,就是将y所在集合放到x所在集合后面 c x:问x立方体下面有多少个立方体呵呵,发现,其实,每次“真正”执行find()的时候,实际上都是对Union的进一步维护,只有进行一次与节点x有关的Union时,才会对x维护,而且,维护过后,x节点之上的节点也会同时被维护,并且直接挂到根节点上,这意味着之后对另一些点的维护并不会影响到已维护了的节点还有就是那个计算,节点x之下的元 阅读全文
posted @ 2011-05-08 20:54 枕边梦 阅读(245) 评论(0) 推荐(0) 编辑
摘要: 这题呢,还好吧,主要是在求相对坐标的时候,有点抽象,不过还是可以理解的,画个坐标对一对就知道了还有就是,并查集的应用,因为要在某一个查询位置判定该点是否已经知道具体坐标,问题转化为俩点是否属于同一个集合,属于同一个集合,则相对于根节点的坐标都知道了,直接求曼哈顿距离,否则无法求出距离代码中附带了解释:#include<stdio.h>#include<string.h>#define MAXN 40010int n,m,k;struct node{ int x,y,f;}f[MAXN];struct node1{ int a,b,d; char ch;}e[MAXN]; 阅读全文
posted @ 2011-05-08 16:50 枕边梦 阅读(236) 评论(0) 推荐(0) 编辑
摘要: 这题目跟杭电的2586很像,呵呵,应该说,本来这道是先做的,但是LAC不会,所以就先做了那道基础题好悲剧呀,在代码里面加了一个测试输出,结果忘记删了,还固执的贡献了几个WA,题目中给的方向是没用的,读进来就可以因为代码基本一样,具体解释见hdu2586#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXN 40010struct node{ int vex,next,dis;}g[MAXN*2],q[10010*2];int f[MAXN],first[MAXN],head[MAXN 阅读全文
posted @ 2011-05-08 13:14 枕边梦 阅读(151) 评论(0) 推荐(0) 编辑
摘要: View Code #include <iostream> #define MAXN 40010 using namespace std ; struct Graph { int vex , next , dis ; }; Graph g[MAXN * 2] , Q[400] ; int first[MAXN] , head[MAXN] , set[MAXN] , away[MAXN] , n , m ; bool visited[MAXN] ; //first[v]用来查找节点所在边,即g[first[v]],同时, g[i].next记录与节点v连接的节点,这俩个记录十分的关键 阅读全文
posted @ 2011-05-08 11:35 枕边梦 阅读(1192) 评论(0) 推荐(0) 编辑
摘要: 这道题一开始的思路不过严谨,忽略 了一种情况,悲剧,本想一次过的这题不难,跟前面的某一到题目类似,不过不是求集合的元素个数,而是求有多少个集合具体思路很简单,在代码中……#include<stdio.h>#define MAXN 50010int f[MAXN],r[MAXN],n,num;int find(int x){ if(x!=f[x]) f[x]=find(f[x]); return f[x];}void Union(int x,int y){ int a=find(x); int b=find(y); if(a==b)//若父节点相同,则表示都出现过了,不同,则表示有一 阅读全文
posted @ 2011-05-06 11:59 枕边梦 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 这题,额,思路很好理解,说难其实也不难,代码也很好实现,就是慢了一点,不知道大牛是怎么过的,十分的好奇ing//题意:题目给出 n 台电脑,距离 d,和各台电脑的坐标(x,y)。电脑要通信要满足两个条件:// 1 电脑被修好,2 电脑之间的距离不超过距离 d 。输入 O p 时代表电脑 p 被修好,输入 S p q 时//代表测试电脑 p 与 q 之间是否可以通信。//思路:用到并查集。如果修好的电脑和已经被修好的电脑之间的距离小于 d ,则合并。//最后判断两台电脑是否可以通信就通过判断电脑是否被修好,根结点是否相等。#include<stdio.h>#include<ma 阅读全文
posted @ 2011-05-06 10:50 枕边梦 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 额, 这题怎么说呢,一开始觉得很难,可是看了别人的思路之后,觉得还可以吧判定是否为树:1):每个节点的入度为0或12):只有一个根节点3):不构成环其他的,在代码中已经有解释了#include<stdio.h>#define MAXN 1010int f[MAXN], r[MAXN],k[MAXN];//f[]记录该节点的父节点,r[]记录该节点的子节点个数,k[]记录该节点是否出现过int find(int x){ if(x!=f[x]) f[x]=find(f[x]); return f[x];}//查找父节点,路径压缩,其实,在这里已经把子节点都连接到根节点上了int dec 阅读全文
posted @ 2011-05-05 13:50 枕边梦 阅读(324) 评论(0) 推荐(0) 编辑