基础算法
cyningsun
这个作者很懒,什么都没留下…
展开
-
补码——计算机中数的表示
(1)正数的补码 与原码相同。(2)负数的补码负数的补码是对其绝对值的原码逐位取反;然后整个数加1。(3)几个特殊数字的补码表示INT_MAX:0111 1111 1111 1111 1111 1111 1111 1111INT_MIN: 1000 0000 0000 0000 0000 0000 0000 0000(无对应的原码)-1: 1原创 2012-04-18 17:59:14 · 1236 阅读 · 0 评论 -
HDOJ 1015 Safecracker
题目不具有单调性,所以求导可以忽略。考虑参数在有限的可选值之中,所以可以选择了深度优先。确定搜索变量为5个参数,然后进行深度优先搜索,并在深度为5时终止搜索,判断状态。#include #includeusing namespace std;#include原创 2011-10-08 17:48:03 · 885 阅读 · 0 评论 -
HDOJ 1023 Train Problem II
火车调度的可行性满足卡特兰数,所以可以直接用卡特兰数的递推公式解题。由于题目N的范围是1~100,所以需要使用大数计算。卡特兰数的递推公式为:F(n)=F(n-1)*(4n-2)/(n+1) #include #define DEPTH 10000;int a[1原创 2011-10-14 23:03:53 · 877 阅读 · 0 评论 -
HDOJ 1060 Leftmost Digit
同样使用lg值计算最高位。任意一个数都可以表示为科学计数法的性质,即N^N=a*10^x,所以最高位就是a的整数部分。1.怎样去除10^X呢? 取lg的对数然后去除整数部分,然后将小数部分再取10的指数得到的值就是a。2.怎样去取最高位。对a取整即是。所以有代码:原创 2011-10-14 23:15:03 · 807 阅读 · 0 评论 -
HDOJ 1044 Collect More Jewels
题目比一般的图类的题目稍微绕了点弯子。要根据问题建立解题所需要的图。起始点@和终止点#includeusing namespace std;#includeint width,height,jewelsNum;struct Point{ int co原创 2011-10-14 23:12:29 · 1220 阅读 · 0 评论 -
HDOJ 1056 HangOver
简单的题目,我的解法采用预处理,然后使用折半查找返回答案。#includedouble answer[300];int len=0;double num;int binarySearch(){ int l=1,r=len,half; w原创 2011-10-14 23:13:44 · 757 阅读 · 0 评论 -
HDOJ 1027 Ignatius and the Princess II
如果知道STL函数库中的next_permutation函数,此题丝毫没有难度。然后可以反复调用此函数即可。我在此基础上做了优化。因为第N!th的序列都相当于将序列的后n位逆序排列。所以可以在调用next_permutation函数之前,优化前N!次调用(N!#include原创 2011-10-14 23:07:02 · 802 阅读 · 0 评论 -
HDOJ 1026 Ignatius and the Princess I
题目倒是简单,只不过要记录走过的路径和输出时候的特别格式让人很纠结。我使用指针记录父节点的数据,当找到解答的时候就根据指针反向遍历整个路径,并将路径上得节点压入栈中。在输出位置依据格式出栈输出即可。#include #include using namespace s原创 2011-10-14 23:05:37 · 909 阅读 · 0 评论 -
HDOJ 1063 Exponentiation
大数乘法,过不了只能说明测试用例不完备。贴几组测试用例:5.1004 15 41120989454.314570363993506408035342551967503175087477761156936917581824000.10 20 .00000000000原创 2011-10-14 23:19:00 · 906 阅读 · 2 评论 -
HDOJ 1043 Eight
用了五天左右做了一下八数码的问题,所谓的八重境界也就是实现了四种而已,但是心里已经感觉实在坐不下去了,就这样总结一下吧。八数码问题使用了两点辅助工具。第一是曼哈顿距离,用来作为A*的h函数以及IDA*的剪枝。第二是康拓展开,用来标识已经遍历过的状态。第三是逆序数,作为问题的剪枝。原创 2011-09-21 15:10:38 · 1388 阅读 · 0 评论 -
HDOJ 1011 Starship Troopers
树上的动态规划第一次做,很纠结也很混乱。其实回过头开一下,也就那么样,过不去的不是自己的知识,只是自己的心理关。嗯,今天抽空整理一下动态规划的思路。 动态规划适用于最优化问题,同时最优化问题需要具备两个要素:最有子结构和重叠子问题。①在寻找最有子结构的时候,可以原创 2011-09-20 23:33:56 · 829 阅读 · 0 评论 -
HDOJ 1856 More is better
此题与典型的并查集不同的是,此题要求输出每棵树上节点的个数,所以要考虑的是如何处理节点个数的问题。最后逐个遍历相对于10000000个数据来说显然不是个好方法。仍然是牺牲空间换时间的思想,在‘并’和‘查’的同时将树中的节点个数记录到父节点中。由于数据量较大,所以考虑使用路径压缩。原创 2011-09-18 10:35:38 · 817 阅读 · 0 评论 -
HDOJ 1007 Quoit Design
题目不难,按照最近点对的算法一步一步来就可以了,没什么陷阱,所以一次AC。另外在比较距离时做了小小的优化,只在需要的时候开平方,而不是直接返回平方根。最近点对问题,参考:http://blog.csdn.net/xinhanggebuguake/article/details/6原创 2011-09-19 12:06:16 · 1264 阅读 · 0 评论 -
HDOJ 1018 Big Number
此题需要一些小小的数学知识。lg(N!)=lg(1)+lg(2)+…+lg(N)。而一个数的位长也刚好是其lg值+1。所以有以下代码:#include#includeint main(){ int caseNum,end; double res原创 2011-10-09 17:16:49 · 651 阅读 · 0 评论 -
STL经典算法集锦<二>之堆算法
堆算法主要包括建立最大堆和堆排序算法。所使用建堆的数组将以0开始存储数据。下面将以两种方法建堆:自底向上的建堆(STL和算法导论中使用到的)、自顶向下建堆(即插入建堆的方法)公共操作:int parent(int i){ return (int)((i-1)/2);} int left(int i){ return 2 * i+1;} int rig原创 2012-03-24 19:55:27 · 1654 阅读 · 0 评论 -
STL经典算法集锦<三>之partition与qsort
STL的分割算法主要使用了仿函数来实现。而此处的分割则不,此处实现了两种形式的分割算法:非随机分割算法、随机分割算法(随机算法是在非随机算法的基础上封装而成)。而快速排序则只需简单依赖分割算法就能实现。非随机分割算法:int partition(int array[],int left,int right){ //选择最右侧的元素作为分割标准 int index = left;原创 2012-03-24 20:15:42 · 2017 阅读 · 0 评论 -
Tiff图像高位转低位的处理方法
Tiff图像高位转低位的处理方法处理TIFF图像首先应该对其有所了解,以下了解TIFF文件、TIFF文件的结构部分为Andy在网上摘录并稍作修改。(由于找不到原文出处,所以无法给出原文链接,若原文作者看到,请联系本文作者) 了解TIFF文件 TIF文件格式最早是为了存储扫描仪图像而设计的。它的最大的特点就是与计算机的结构、操作系统以及图形硬件系统无关。它可处理黑白、灰度、彩色图像原创 2010-08-23 14:53:00 · 3363 阅读 · 5 评论 -
博弈论(二):Sprague-Grundy函数
原载网址:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561007.html上一期的文章里我们仔细研究了Nim游戏,并且了解了找出必胜策略的方法。但如果把Nim的规则略加改变,你还能很快找出必胜策略吗?比如说:有n堆石子,每次可以从第1堆石子里取1颗、2颗或3颗,可以从第2堆石子里取奇数颗,可以从第3堆及以后石子里取任意颗……这时看上去问题转载 2011-08-07 17:02:02 · 1157 阅读 · 0 评论 -
最近点对问题
最近点对问题定义:已知上m个点的集合,找出对接近的一对点。 在二维空间里,可用分治法求解最近点对问题。预处理:分别根据点的x轴和y轴坐标进行排序,得到X和Y,很显然此时X和Y中的点就是S中的点。 情况(1):点数小于等于三时:情况(2):点数大于三时: 首先划分集合S为SL和SR,使得SL中的每一个点位于SR中每一个点的左边,并且SL和SR中点数相同原创 2011-09-19 11:56:12 · 1164 阅读 · 0 评论 -
位运算实现加减乘除
#include #include //加法运算int add(int a, int b){ return b==0 ? a: add(a^b,(a&b)<<1);}//补码中正数转负数的原理int negative(int a){ return add(1,~a);}//减法运算int sub(int a,int b){ return add(a,negati原创 2012-04-19 00:06:24 · 2120 阅读 · 0 评论 -
用匈牙利算法求二分图的最大匹配
原载网址:http://imlazy.ycool.com/post.1603708.html 什么是二分图,什么是二分图的最大匹配,这些定义我就不讲了,网上随便都找得到。二分图的最大匹配有两种求法,第一种是最大流(我在此假设读者已有网络流的知识);第二种就是我现在要讲的匈牙利算法。这个算法说白了就是最大流的算法,但是它跟据二分图匹配这个问题的特点,把最大流算法做了简化,提高转载 2011-08-08 08:15:37 · 1112 阅读 · 1 评论 -
康托展开
公式X=an*(n-1)!+an-1*(n-2)!+...+ai*(i-1)!+...+a2*1!+a1*0! 其中,a为整数,ai为当前未出现的数字中是排在第几个(从0开始)。因此0X便是整个全排列中第X大的数。用途显然,n位(0~n-1)全排列后,其康托展开唯一且最大约为n!,因此可以由更小的空间来储存这些排列。由公式可将X逆推出对应的全排列。 两种实现正向原创 2011-09-21 14:27:13 · 2096 阅读 · 0 评论 -
位运算能做什么
1、int变量的奇偶性(变量A) A&1 = 0 (偶数) A&1 = 1 (奇数)2、int变量第K位的操作。(变量A) (A>>K)&1 (比特位) A=A|(1置位) A=A&~(1清零)3、两整数的平均值(变量A、B) (A & B) +原创 2012-04-19 15:48:40 · 2597 阅读 · 1 评论 -
glViewPort,glOrtho与视见区,修剪区间
图(1)样例:正方形图像图(2)正方形在方形区域中的显示图(3)正方形在矩形区域中的显示假设 若从样例图像按(W1,H1)的长宽进行取样,即修剪空间所使用为 void glOrtho(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top,GLdouble near,GLdouble far原创 2011-09-18 10:03:53 · 1883 阅读 · 0 评论 -
求int型整数的最大值和最小值
方法一:#includeint main(){ int i=0,j=1; while(j>0) { j++; i++; } cout<<i<<endl; i++; cout<<i<<endl; return 0;}方法二:#includeint main(){ int i=0; i=~i; i=i<<(sizeof(int)*8-1); cout<<原创 2010-08-09 11:05:00 · 2453 阅读 · 0 评论 -
博弈论(一):Nim游戏
原载网址:http://www.cnblogs.com/Knuth/archive/2009/09/05/1561008.html重点结论:对于一个Nim游戏的局面(a1,a2,...,an),它是P-position当且仅当a1^a2^...^an=0,其中^表示位异或(xor)运算。Nim游戏是博弈论中最经典的模型(之一?),它又有着十分简单的规则和无比优美的结论,由这个游戏开始了转载 2011-08-07 17:04:20 · 746 阅读 · 0 评论 -
STL经典算法集锦<一>之list::sort
算法中使用到的数据结构:typedef struct Node* Link;struct Node{ int value; Link next;};算法代码://链表的归并void merge(Link& first,Link& second){ Node newHead; Link temp=&newHead; while(first!=NULL&&second!原创 2012-03-23 15:27:36 · 1532 阅读 · 0 评论 -
STL经典算法集锦
所谓经典算法是指STL中有一定的复杂性并且又经常用到的算法。其他算法多是较为容易,利用STL操作很容易实现就不在此之列了。共计15个算法,包括: 1、list::sort 2、heap 3、partition 4、rotate(链表版,数组版,即random_原创 2012-03-23 10:01:45 · 1490 阅读 · 0 评论 -
HDOJ 1150 Machine Schedule解题报告
用二分图的最大匹配来求解题目,关于其思想详见:http://blog.csdn.net/xinhanggebuguake/article/details/6668071//#include#includeusing namespace std;const int原创 2011-08-08 08:49:04 · 882 阅读 · 0 评论 -
HDOJ 1010 Tempter of the Bone解题报告
//#include #include #include using namespace std;char maze[8][8]; int n,m,t,di,dj; bool escape; int dir[4][2]={{0,-1},{0,1原创 2011-08-07 21:38:42 · 687 阅读 · 0 评论 -
HDOJ 1536 S-Nim解题报告
首先,S-Nim是经典的博弈类的题目可以用Sprague-Grundy函数进行解决,关于Sprague-Grundy函数的方法,见链接文章:Sprague-Grundy函数 其次,关于Sprague-Grundy函数的SG值。S-Nim类的游戏转化为N原创 2011-08-07 18:30:04 · 1224 阅读 · 0 评论 -
HDOJ 1039 Easier Done Than Said?解题报告
<br />#include <stdio.h>#include <memory.h>#include <bitset>using namespace std;int main(){ char str[22]; bool flag; bitset<20> sign原创 2010-10-16 16:37:00 · 796 阅读 · 0 评论 -
HDOJ 1009 FatMouse' Trade解题报告
#include#include #includestruct Exchange{ int room; int javabean;};int cmp( const void *a , const void *b ) { struct Exchange *c =原创 2011-07-31 21:16:31 · 821 阅读 · 0 评论 -
HDOJ 1160 FatMouse's Speed解题报告
//#include #include#include #include using namespace std;struct Mice{ int weight; int speed; int pos;};int cmp( const void *a , c原创 2011-07-31 21:55:13 · 910 阅读 · 0 评论 -
HDOJ 1272 小希的迷宫解题报告
//WA的解答//#include #include using namespace std;unsigned point[100001];unsigned find(unsigned value){ int temp=value; while(value!=p原创 2011-07-31 22:10:06 · 1187 阅读 · 0 评论 -
HDOJ 1028 Ignatius and the Princess III解题报告
//#include #include using namespace std;int main(){ //fstream cin("Ignatius and the Princess III.txt"); unsigned num; while(cin>原创 2011-07-31 22:17:30 · 789 阅读 · 0 评论 -
HDOJ 1012 u Calculate e解题报告
#include #include using namespace std;int func(int n){ int sum = 1; for(int i = 1;i原创 2010-08-19 20:11:00 · 1391 阅读 · 0 评论 -
HDOJ 1021 Fibonacci Again解题报告
<br />#include<iostream>#include <string>using namespace std;int main(){ int n; while(cin>>n) { int f1=1,f2=2,fn=1; for(int i=1;i原创 2010-08-21 00:57:00 · 868 阅读 · 0 评论 -
HDOJ 1032 The 3n + 1 problem解题报告
<br />#include <iostream>#include <vector>using namespace std;int main(){ int m,n; while (cin>>m>>n) { int result=0,max,min; //①此原创 2010-08-23 11:38:00 · 993 阅读 · 0 评论 -
算法导论第七章学习笔记
Randomized quicksortIdea: Partition around a random element.Running time is independent of the input order.No assumptions need to be made about the input distribution.No specific input elicits the worst-case behavior.The worst case is determined原创 2011-05-02 13:25:00 · 1372 阅读 · 0 评论