- 博客(19)
- 资源 (4)
- 收藏
- 关注
原创 HDU 2527
题目描述 HDU 2527分析 霍夫曼编码的应用。 本题没有必要构造一棵完整的霍夫曼树。只需利用霍夫曼编码的原理,每次挑选频率最低的两个元素进行合并。(显然,可以利用优先级队列,这里用数组来模拟)源码 //每次挑出现频率最小的两个元素,应该用优先级队列!!!!!!!!!!#include #include #i
2013-08-23 17:03:08 981
原创 HDU 2569
题目描述 HDU 2569分析 使用递推的方法可以解决。 设当悬崖的长度为n时,到达彼岸的方法有F[n]种。 显然,F[1] = 3, F[2] = 9, F[3] = 21 假设已知F[n-1]与F[n-2],寻求F[n]与F[n-1]、F[n-2]之间的关系。 分为两种情况:
2013-08-23 09:53:29 825
原创 HDU 2544
题目描述: HDU 2544分析: Dijkstra算法的典型应用。源码: #include #include //三个数组分别记录路线,最短距离,以及标志是否已经被扩展int map[101][101], dist[101], s[101];void dijkstra(int n, int x);int main(){
2013-08-23 09:34:22 952
转载 makefile基础
概述什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要懂。这就好像现在有这么多的HTML的编辑器,但如果你想成为一个专业人士,你还是要了解HTML的标识的含义。特别在Unix下的软件编译,你就不能不自己写makefile了,会不会写makefil
2013-07-19 11:46:27 620
原创 不使用中间变量交换两个数
传统方法在交换两个数的值时,最经常使用的方法是借助于一个中间变量来进行交换。 temp = a; a = b; b = temp;方法一通过巧妙的加法与减法运算来实现两个数的交换。 a = a + b; b = a - b; a = a - b;方法二使用位运算(异或)来交换
2013-06-29 09:59:55 897
原创 线段树
线段树概述 线段树是一种二叉搜索树,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶节点。 线段树是建立在线段的基础上,每个结点都代表了一条线段[a , b]。长度为1的线段称为元线段。非元线段都有两个子结点,左结点代表的线段为[a , (a + b ) / 2],右结点代表的线段为[( a + b ) / 2 + 1 , b]。
2013-06-21 16:31:40 726
原创 HDU 1009
题目描述: HDOJ 1009分析: 最简单的贪心算法的应用。 由于可以购买一个房间中的部分JavaBeans,直接将所有的JavaBeans按单价由高到低排序,然后贪心购买即可。最后购买的那个房间可能只购买其中的一部分JavaBeans。源码:#include void bubbleSort(float price[], i
2013-06-20 19:03:57 1056
原创 HDU 1213
题目 HDOJ 1213分析 最基本的并查集问题。 最后森林中树的数目(集合的数目)就是需要的桌子数。 求集合个数的方法:祖先为自身的元素个数即为集合数目。源代码#include void makeSet(int N);void unionSet(int A, int B);int findSet(int
2013-06-14 17:30:18 788
原创 最小生成树
相关概念 对于一个无向连通图G = (V, E),V是图中顶点的集合,E是图中边的集合。对于图中的每一条边(u, v) ∈ E,都有一个权值w(u, v)表示连接u和v的代价。最小生成树(Minimum Spanning Tree)问题就是找到一个无回路的子集T,它连接了所有的顶点,且其权值之和最小。常用算法 解决最小生成树类问题有两种常用的算法:Krusk
2013-06-04 22:43:06 649
原创 博弈问题
博弈问题概述 常见的博弈类问题有三种:巴什博弈、威佐夫博弈和尼姆博弈。 一般的思路都是寻找奇异局势(必败态)。 必败态:下一步无论如何处理都会达到必胜态; 必胜态:下一步至少存在一种处理可以达到必败态。 如果一开始是一个奇异局势,则先手必败;否则,先手必赢(如果双方都懂得游戏规则)。巴什博弈问
2013-06-03 21:53:08 1028
原创 二叉查找树(BST)及其C语言实现
二叉查找树 对任何节点x,其左子树中的关键字最大不超过key[x],右子树中的关键字最小不小于key[x]。 二叉查找树这种数据结构,它支持多种动态集合操作,search,minimum,maximum,predecessor(前驱),successor(后继),insert以及delete。在二叉查找树上执行的基本操作时间与树的高度成正比。对于一棵含有n个节点
2013-05-22 17:33:09 1778
原创 巧用异或运算
异或运算 对两个整数进行异或运算(运算符为^),将两个整数化成二进制表示,然后逐位运算。运算规则如下: 0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0; 即两个位相同时,异或结果为0,反之,异或结果为1. 因此,两个相等的整数异或结果为
2013-05-17 14:57:15 1240
原创 函数指针
函数地址 函数也有地址,函数地址指的是存储其机器语言代码的内存的开始地址。 可以编写将另一个函数的地址作为参数的函数。这意味着,可以在不同的时间使用不同的函数。函数地址的获取 函数名即为函数地址。 如果f()是一个函数,则f就是该函数的地址。要将函数作为参数进行传递,必须传递函数名。 process (t
2013-05-03 11:11:44 495
原创 HDU 2199
题目描述 题目:HDOJ 2199分析 Y的值随着x的增加(0 注意"No solution!"的条件,可以通过设定两个阈值min和max来实现源代码#include double getValue(double x);int main(){ int T; double Y; double left, right, mi
2013-05-01 22:51:24 644
原创 HDU 3342
题目描述 题目:HDOJ 3342 题目真啰嗦,实际上是判断一个有向图中是否存在环。分析 应用拓扑排序,如果一个有向图可以顺利完成拓扑排序,其肯定不存在环;否则,该有向图肯定存在环。 陷阱:在输入数据的时候注意数据可能会重复,因此要加一个判断源代码#include #include int nodeRelati
2013-04-30 21:02:58 573
原创 内存对齐
内存对齐原因 主要是两个方面的原因: (1):平台原因(方便移植) 不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出硬件异常; (2):性能原因 数据结构应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的
2013-04-27 17:21:04 558
原创 动态规划求解最大连续子序列和
问题描述输入一组整数,求出这组数字连续子序列和中最大值。也就是只要求出最大子序列的和,不必求出最大的那个序列。例如:序列:-2 11 -4 13 -5 -2,则最大连续子序列和为20序列:-6 2 4 -7 5 3 2 -1 6 -9 10 -2,则最大连续子序列和为16。分析能想起来的用动态规划方法解决的最简单的题目了。其它方法时间代价过大,动态规划的时间代价仅为O(
2013-04-27 11:09:57 1030
原创 Windows与Linux中的回车换行
回车与换行的起源关于“回车”(carriage return)和“换行”(line feed)这两个概念的来历和区别。在计算机还没有出现之前,有一种叫做电传打字机(Teletype Model 33)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。于是,研制人员想
2013-04-27 10:48:52 1048
原创 C++内联函数与C语言宏的比较
C++内联函数通过将内联函数的编译代码与其它程序代码“内联”起来,提高程序运行的速度。即:编译器将使用相应的函数代码替换函数调用。对于内联代码,程序无需跳到另一个位置处执行代码,然后在跳回来。因此,内联函数的运行速度比常规函数稍快,但代价是要占用更多的内存。若在多个不同的地方调用同一个内联函数,则程序将包括该函数的多个代码拷贝。应当有选择的使用内联函数。当函数代码过长或者逻辑较为复
2013-04-27 10:18:15 1160
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人