上一页 1 2 3 4 5 6 7 8 9 10 ··· 12 下一页
摘要: 时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排序,外部排序)数论(整除,集合论,关系,素数,进位制,辗转相除,扩展的辗转相除,同余运算,解线性同余方程,中国剩余定理)指针(链表,搜索判重,邻接表,开散列,二叉树的表示,多叉树的表示)按位运算(and,or,xor,shl,shr,一些应用)图论(图论模型的建立,平面图,欧拉公式与五色定理,求强连通分量,求割点和桥,欧拉回路,AOV问题,AOE问题,最小生成树的三种算法,最短路的三种算法,标号法,差分约束系统,验证二分图 阅读全文
posted @ 2011-04-12 22:39 CoderZhuang 阅读(1169) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2286今天又做了个迭代加深,不错继续努力!! 移动八根线中任一根,移法为头的数移到线的尾,其它的数向头进一位。求最少要移多少次才能使中间的八个数相等。本题若用广搜,空间需求量非常大,空间不足。深搜的话,深度很难控制,容易陷入死循环。在这个时候就要用到迭代加深的深搜方法。所谓迭代加深,就是在深度无上限的情况下,先预估一个深度(尽量小)进行搜索,如果没有找到解,再逐步放大深度搜索。这种方法虽然会导致重复的遍历 某些结点,但是由于搜索的复杂度是呈指数级别增加的,所以对于下一层搜索,前面的工作可以忽略不计,因而不会导致时间上的亏空。这种方法,可以算 阅读全文
posted @ 2011-04-12 11:37 CoderZhuang 阅读(171) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2312 相信坦克大战大家都玩过吧,本题就是根据这个游戏设计的。坦克要从起点(Y),到目的地(T),坦克不能通过钢墙(S),河(R),可以在空地在行走(E),射击破坏砖墙(B),射击砖墙时不行走且花费一个单位的时间。求坦克从起点到目的地最少花多少时间,不可达输出-1; 很好的一道搜索题。因为考虑到通过砖墙时和空地所花的时间不同,所以不能简单的用BFS广搜来做。用DFS深搜,你会发现时间复杂非常高,必然会超时(最大是300*300的图)。本题可以能过优先队列+bfs 或 记忆化广搜两种方法来解决。一、优先队列+BFS法: 也是用到了广搜的思想, 阅读全文
posted @ 2011-04-11 21:34 CoderZhuang 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 找某颗星的左下角有几颗星。输出有多少颗星左下角拥有0颗星,有多少颗左下角拥有1颗星……一直到n-1 。因为输入时是按y值是递增的,所以直接用x(x也是递增的)来构建树状数组,接下来其实就是统计x 前面有多少个比它少的数。树状数组参考:http://zxj015.blog.163.com/blog/static/170613730201136105251115/#include<iostream>#include<stdio.h>#include<stdlib.h>using namespace std;const int MAX = 32002;int n, 阅读全文
posted @ 2011-04-08 17:54 CoderZhuang 阅读(104) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=2299给定一个整数数列,相邻之间的数可以互换,求最少要多少次互换后得到一个升序数列。本题说白了就是求解逆序对问题(关于逆序对请参考:http://baike.baidu.com/view/689576.htm),接下来便是用归并排序来解逆序对了。#include <stdio.h>#include <stdlib.h>#define MAX 500001int n, a[MAX], t[MAX];__int64 sum;void Merge(int l, int m, int r){ int p = 0; int i 阅读全文
posted @ 2011-04-07 11:33 CoderZhuang 阅读(116) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3321一棵树,开始时每个结点都有一个苹果,输入C x表示更新x结点,若x结点有苹果,把该结点苹果摘掉,若该节点无苹果,在该节点上增加一个新的苹果。输入Q x表示以该节点为根的子树有多少个苹果。伸手便该题主要问题是如何把一棵树转化为树状数组,之后便可以直接运用树状数组来求区间的和。转化的方法是用dfs深搜遍历树,每一个结点要做两次标记,第一次访问到时标记该结点,即为该结点在树状数组中的起始位置,第二次当dfs深搜返回时又一次标记,即为该结点在树状数组中末位置,始末位置之间即代表了以该结点为根的子树的所有结点。有关树状数组问题可以参考:http 阅读全文
posted @ 2011-04-06 23:34 CoderZhuang 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 在这里还是先转一篇较好的讲解学习一下。http://www.cnblogs.com/yykkciwei/archive/2009/05/08/1452889.html树状数组问题提出:已知数组a[],元素个数为n,现在更改a中的元素,要求得新的a数组中i到j区间内的和(1<=i<=j<=n).思考:对于这个问题,我们可以暴力地来解决,从a[i]一直累加到a[j],最坏的情况下复杂度为O(n),对于m次change&querry,合起来的复杂度为O(m*n),在n或m很大的情况下,这样的复杂度是让人无法忍受的.另外,如果没有元素的变更,我们完全可以存储sum[1,k]( 阅读全文
posted @ 2011-04-06 22:58 CoderZhuang 阅读(120) 评论(0) 推荐(0) 编辑
摘要: http://poj.org/problem?id=3083入口S,出口E,分别求由入口 到出口靠左走,靠右走,和最短路三种走法各自的步数。入口和出口在边界处,并且不会在四个角上,入口和出口至少隔着一个阻碍。本来是想找一个广搜和深搜结合的题目,百度一下找到的这题,后来发现这题所谓的广搜加深搜只是用深搜找一条路径,而用广搜找另外一条路径,。根本不是我希望的广搜和深搜的结合。 不过既然题目已经看了,还是做一做吧。求最短路的没什么好说的,用一下广搜就可以解决问题了。主要是靠左走和靠右走的部分,这里用到了两个数组,dirx[],diry[],共同来确定方向。dirx[],diry[],数组的下标增1. 阅读全文
posted @ 2011-04-01 17:26 CoderZhuang 阅读(160) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1983转自:http://hi.baidu.com/song19870626/blog/item/b44a8110d9341376ca80c48d.html思路:封锁出口或者入口周围的格子. 最多需要4个封锁点. 所以我们可以采取这样的策略: 1.寻找一条盗贼的可行路线,如果没有,返回0. 2.计算封锁出口和入口四周需要的封锁点数量,取小的一个,假设是k,k <=4 3.从少到多,遍历所有封锁点个数小于k的方案,验证是否是一条有效的覆盖方案(可以通过是否阻止了1中的盗贼线路进行快速验证). 如果有有效覆 阅读全文
posted @ 2011-03-30 22:12 CoderZhuang 阅读(202) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=1800soldiers学习使用魔法扫帚,水平高的可以教水平在他之下的,每个老师有而只有一个学生,并且可以共用一个魔法扫帚练习,要求每个soldier都要有练习魔法扫帚的机会,求最少需要多少个魔法扫帚。如士兵A B C D E水平分别为2 4 5 6 4方法可以是:C教B,B教A,D教E,这样ABC共用一把扫帚,DE共用一把扫帚;只用两把扫帚即可。而结果也只需要两把就可以了。先对数列排序,然后筛选出相等元素,这样循环筛选,每筛选一次代表扫帚增一,直到无可筛选的元素。C could teach B; B coul 阅读全文
posted @ 2011-03-30 18:51 CoderZhuang 阅读(103) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 9 10 ··· 12 下一页