算法
文章平均质量分 62
OJ题解
Nickqiao
这个作者很懒,什么都没留下…
展开
-
分治法
void perm(char a[],int start,int end){ if(start==end) { printf("%s\n",a); return; } else原创 2016-06-08 20:49:19 · 434 阅读 · 0 评论 -
水果篮子(母函数)
题目:Description西瓜的表弟小西瓜生病住院了,西瓜想去买一个水果篮子探望他。水果店里面有很多种类的水果篮子,价格相同,但是水果的搭配各不相同。西瓜突然想到了一个问题,现在水果店里面有这么N种水果,第i个水果单价是Pi元,西瓜手上有M元钱(钱不一定要花完,但也不能什么水果都没有),一共有几种搭配水果篮子的方法呢。Input题目包含多组输入,EOF结束,数原创 2016-07-28 20:48:51 · 631 阅读 · 0 评论 -
链表部分逆置
题目:给定一个固定的单链表,输入两个数begin和end。将下标为begin到end之间的内容逆置。给定的单链表为:0->2->4->6->8->10->12->14->16->18测试数据确保begin和end不会超出单链表的长度范围,并且end>=begin样例输入2 4样例输出0->2->8->6->4->10->12->14->16->1原创 2016-07-27 20:57:16 · 634 阅读 · 2 评论 -
判断链表是否有环
题目:有一个链表,我们需要判断链表中是否存在环。有环则输出true,否则输出false。输入有多行,每行为由空格分隔的两个整数m和n,m是当前结点的数据,n代表当前结点的指针域指向第n个结点。n存在四种情形:①为-1,代表该结点的指针域指向NULL,输入结束;②指向该结点之前的结点,如第3个结点的指针域指向n = 2的结点;③指向自己,如第3个结点的指针域指向n = 3原创 2016-07-27 21:14:41 · 429 阅读 · 0 评论 -
单调栈
题目:地上从左到右竖立着 n 块木板,从 1 到 n 依次编号,如下图所示。我们知道每块木板的高度,在第 n 块木板右侧竖立着一块高度无限大的木板,现对每块木板依次做如下的操作:对于第 i 块木板,我们从其右侧开始倒水,直到水的高度等于第 i 块木板的高度,倒入的水会淹没 ai 块木板(如果木板左右两侧水的高度大于等于木板高度即视为木板被淹没),求 n 次操作后,所有 ai 的和是多少。如图上原创 2016-08-09 21:24:56 · 557 阅读 · 0 评论 -
堆排序
从小到大排序,建立大根堆,每次将最后一个元素与堆顶交换,此时最大元素到堆尾,堆元素-1,自上而下维护大根堆,得到的数组即从小到大#includeusing namespace std;class Heap {private: int *data, size;public: Heap(int length_input) { data = new int[l原创 2016-09-17 21:52:48 · 320 阅读 · 0 评论 -
哈夫曼编码
首先统计每个字母在字符串里出现的频率,我们把每个字母看成一个结点,结点的权值即是字母出现的频率,我们把每个结点看成一棵只有根结点的二叉树,一开始把所有二叉树都放在一个集合里。接下来开始如下编码:步骤一:从集合里取出两个根结点权值最小的树 a 和 b,构造出一棵新的二叉树 c,二叉树 c 的根结点的权值为 a 和 b 的根结点权值和,二叉树 c 的左右子树分别是 a 和 b。步骤二:将二叉树原创 2016-09-17 23:51:54 · 1199 阅读 · 1 评论 -
两个栈实现队列
两个栈stack1,stack2,入队时压入stack1,出队时将stack1中的元素弹出压入stack2中,并将stack2栈顶弹出,完成出队。原创 2016-09-19 14:42:00 · 312 阅读 · 0 评论 -
排序算法总结
选择,快速,希尔,堆排序为不稳定排序,插入,冒泡,归并,基数排序为稳定排序。插入排序:将数据分为有序部分和待排序部分,每次将待排序部分的第一个元素在有序部分中找到插入的位置,并将其插入。for(int i=1;i<length;i++){ for(int j=i-1;j>=0;j--){ if(data[j]>data[j+1]){ ...原创 2016-09-21 21:00:31 · 389 阅读 · 0 评论 -
已知二叉树前序中序遍历重建二叉树
中序遍历中根节点前的节点为左子树,根节点后的节点为右子树。class Soultion{public: struct TreeNode* reConstructBinaryTree(vector pre,vector in) { int inlen=in.size(); if(inlen==0) return NULL; vectorl原创 2016-09-30 22:48:54 · 484 阅读 · 0 评论 -
二叉树的深度
最大深度class Solution {public: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL) return 0; int l=TreeDepth(pRoot->left)+1; int r=TreeDepth(pRoot->right)+1;原创 2016-10-27 11:27:17 · 353 阅读 · 0 评论 -
二叉搜索树转化双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表要求排序可以想到中序遍历,把根节点的左右子树都转换成排序好的双向链表,再将根节点左子树的最大值,右子树的最小值与根节点相连。class Solution {public: TreeNode* Convert(TreeNode* pRootOfTree) { TreeNode *last原创 2016-10-30 13:21:01 · 288 阅读 · 0 评论 -
不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。分析:肯定用位运算,模拟加法时首先将各位相加不进位,然后再算进位,最后相加。例如5+17=22,首先各位相加得到12,然后算进位得到10,再相加得到22.各位相加不进位用异或计算,算进位先用与运算,再左移一位,然后重复直到没有进位。int Add(int num1,int num2){ int sum原创 2016-11-15 21:39:04 · 367 阅读 · 0 评论 -
KMP算法详解
一直以来对KMP算法理解的不是很透彻。看了左神的程序员代码面试指南后感觉基本明白了。我们都知道KMP算法最重要的是next数组,next[i]的含义是在match[i]之前的字符串match[0..i-1]中,必须以match[i-1]结尾的后缀子串(不能包含match[0])与必须以match[0]开头的前缀子串(不能包含match[i-1])最大匹配长度是多少。比如match="aaaab原创 2017-03-04 18:00:34 · 585 阅读 · 0 评论 -
HDU2602(01背包)
分析:01背包裸题代码:#include#include#include#include#includeusing namespace std;int dp[1009];int w[1009],c[1009];int main(){ int t,n,v; scanf("%d",&t); while(t--) { scanf("%原创 2016-07-02 23:21:43 · 380 阅读 · 0 评论 -
HDU1231(DP)
题目:Problem Description给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20。 在今年的数据结构考卷中,要求编写程序得到最大和,原创 2016-07-30 21:35:31 · 762 阅读 · 0 评论 -
POJ1328(贪心)
题目大意:x轴为河岸,给出小岛坐标,在河岸上建探测范围一定雷达,要求覆盖所有小岛,求雷达的最小个数。分析:以小岛为圆心,探测半径画圆,与x轴交于ai,bi,求出所有区间并排序,如果两个区间有重叠,则可覆盖,将bi更新为b(i-1)即可。代码:#include#include#include#includeusing namespace std;struct xy{ int原创 2016-04-25 12:53:35 · 794 阅读 · 0 评论 -
POJ2524(并查集)
大意:调查宗教,n个人m组数据,每组数据a,b表示a,b同一种,求一共几种。分析:并查集。代码:#include #include #include using namespace std;int pre[50005];bool t[50005];int find(int x){ int r = x; while (r != pre[r]) r = pre[r];原创 2016-04-25 12:55:06 · 467 阅读 · 0 评论 -
POJ2506(递推+高精度)
题目大意:2xN放2x1和2x2的方块多少种放法。分析:a[n]=a[n-1]+a[n-2]*2 2xN相当于2x(n-1)加一个竖着的方块,和2x(n-2)加两个竖着的,两个横着的,一个大方块,其中放两个竖着的重复。代码:#include #include #include using namespace std;string s[255];s原创 2016-04-25 12:56:47 · 998 阅读 · 0 评论 -
POJ2586(贪心)
大意:每5个月(12345 23456...)提交一次报表,保证每次都是亏损的。每个月盈利s,亏损d,全年最大盈利。分析:每次1个月亏损,2个月亏损。。。4个月亏损,依次求利润。代码:#include#includeint s,d;int main(){ while(scanf("%d%d",&s,&d)!=EOF) { int sum; if(d>4*s)原创 2016-04-25 12:58:27 · 502 阅读 · 0 评论 -
POJ1068(模拟)
大意:给出一串括号组合,p型表示当前位置左边有几个左括号,w型表示与当前括号匹配的左括号右边有几个右括号。给出p求w。分析:用一个数组c储存当前位置相邻两个右括号有几个左括号,如果相邻右左括号则为1,否则往前匹配,匹配一次对应的c[t]-1,b[i] = b[t]+i-t。代码:#include#include#includeusing namespace std;int a[原创 2016-04-25 13:00:31 · 444 阅读 · 0 评论 -
POJ1306(组合数公式)
题意:求Cnm分析:组合数公式。C(n,m)=C(n-1,m-1)+C(n-1,m)代码:#include #include #include using namespace std;const int maxn = 110;double c[maxn][maxn];int main(){ int n, m; while(scanf("%d%d", &n原创 2016-04-25 13:03:37 · 713 阅读 · 0 评论 -
POJ3176(DP)
大意:例 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5从上往下只能往左边或右边走,求沿途数字最大和。分析:代码:#include#include#include#includeusing namespace std原创 2016-04-27 19:39:10 · 376 阅读 · 0 评论 -
POJ2752(KMP)
大意:给定一个字符串,求所有可能的既是前缀又是后缀的字串长度。分析:按题目的意思很像求KMP中的next数组。next[len]是最大的前缀-后缀字符串长度,以此类推next[next[len]]同样为满足条件的前缀-后缀字符串长度。代码:#include #include #include using namespace std;char str[400005];int l原创 2016-05-08 23:35:53 · 506 阅读 · 2 评论 -
POJ1611(并查集)
大意:Description严重急性呼吸系统综合症( SARS), 一种原因不明的非典型性肺炎,从2003年3月中旬开始被认为是全球威胁。为了减少传播给别人的机会, 最好的策略是隔离可能的患者。在Not-Spreading-Your-Sickness大学( NSYSU), 有许多学生团体。同一组的学生经常彼此相通,一个学生可以同时加入几个小组。为了防止非典的传播,NSY原创 2016-05-09 23:58:01 · 3444 阅读 · 1 评论 -
POJ1936(字符串处理)
大意:给定两个字符串a,b,判断a是否是b的子序列。分析:代码:逐位对比即可。#include#include#include#includeusing namespace std;char a[100005],b[100005];int main(){ //freopen("C:\\in.txt","r",stdin); while(scanf("%原创 2016-05-10 00:06:47 · 513 阅读 · 0 评论 -
POJ2503(二分,哈希)
大意:给定n(n分析:枚举超时用二分。代码:#include #include #include #include const int maxn = 100010;using namespace std;struct node{ char e[60], s[60];}dic[maxn];char t[60];int pos;int cmp(node a, nod原创 2016-05-10 22:24:28 · 1425 阅读 · 0 评论 -
POJ2299(归并排序)
大意:给定一串数字,求冒泡排序需要交换的次数。分析:一个乱序序列的逆序数=只允许相邻两个元素交换的条件下,得到有序序列的交换次数。归并排序可以求数列的逆序数。归并排序:比较a[i]和a[j]的大小,若a[i]≤a[j],则将第一个有序表中的元素a[i]复制到r[k]中,并令i和k分别加上1;否则将第二个有序表中的元素a[j]复制到r[k]中,并令j和k分别加上1,如此循环下去,直到其中一个原创 2016-05-13 20:32:13 · 716 阅读 · 0 评论 -
POJ1035(字符串)
大意:判断一个字符串能否由字典中的字符串替换,删除或插入一个字符得到。分析:水题代码:#include #include #include #include #include using namespace std;char dic[10005][17],ch[55][17];int dic1[10005];void rep(char s[]){ char s1[1原创 2016-05-19 22:10:28 · 475 阅读 · 0 评论 -
HDOJ1060
题目大意:给定一个正整数N,请输出N的N次方最左边的数。(N>=1&&n分析:N较大,可以令:N的N次方=d.xxx * 10的(k-1)次方,其中k表示N的N次方的位数。而位数k=lgX(取整)+1,因此d=10的(lg(N的N次方)-lg(N的N次方)(取整))次方(取整)。代码:#include #include #include using namespace std原创 2016-04-25 12:45:38 · 553 阅读 · 0 评论 -
POJ1840(哈希)
大意:DescriptionConsider equations having the following form: a1x13+ a2x23+ a3x33+ a4x43+ a5x53=0 The coefficients are given integers from the interval [-50,50]. It is consider a solution a原创 2016-05-24 23:44:44 · 470 阅读 · 0 评论 -
HDU1426(DFS)
题目:Problem Description自从2006年3月10日至11日的首届数独世界锦标赛以后,数独这项游戏越来越受到人们的喜爱和重视。据说,在2008北京奥运会上,会将数独列为一个单独的项目进行比赛,冠军将有可能获得的一份巨大的奖品———HDU免费七日游外加lcy亲笔签名以及同hdu acm team合影留念的机会。所以全球人民前仆后继,为了奖品日夜训练茶饭不思。当原创 2016-07-15 19:10:20 · 562 阅读 · 0 评论 -
HDU4474(数位BFS)
大意:给一个数N(1分析:如果n%a=m,则在n末尾加上i,新余数为(m*10+i)%a,按位搜索记录每添一个数字后的余数,余数为0则回溯输出结果。代码:#include #include #include #include #include #include #define N 10005using namespace std;bool vis[N], del[10];/原创 2016-07-15 14:27:13 · 900 阅读 · 0 评论 -
石油探测(DFS)
题目:Description地质探测公司负责探测地下石油资源,每次在一块矩形的区域上查找。探测人员用把这块矩形区域分成 了N X M个正方形小块,然后对每个正方形小块分别进行分析,经过分析之后,为每个小块都做了一个标记,如果一个小块地下发现有石油,则用“@”标记,否则用”.标记”。如果两个含有石油的小块是相邻的,那么它们属于同一块石油地,这里的相邻包括水平,垂直,或者对角相邻。给定原创 2016-07-10 17:11:52 · 1553 阅读 · 0 评论 -
马的走法(DFS)
题目:Description在一个4×5的棋盘上,输入马的起始位置坐标(纵,横)位置,求马能返回初始位置的所有不同走法的总数(马走过的位置不能重复,马走“日”字)。Input输入只有一行,包括两个整数,既马的起始位置坐标x和y值,并且,这个坐标一定在4×5的小棋盘上,即 0Output一个整数,为能返回到初始位置的所有不同走法的总数。原创 2016-07-10 17:21:42 · 1183 阅读 · 0 评论 -
HDOJ2037(贪心)
ProblemDescription“今年暑假不AC?”“是的。”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...”确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女原创 2016-04-25 12:51:01 · 425 阅读 · 0 评论 -
HDOJ1051(贪心)
题目大意:有一堆n个木棍,长度质量已知,机器处理木棍需要设置时间,规定(1)第一根木棍的设置时间是1min(2)前一个处理的木棍长度和质量小于等于后一个就不用设置时间,否则需要1min设置找到最小建立时间。如 给出(4,9)(5,2)(2,1)(3,5)(1,4)则最小建立时间(1,4)(3,5)(4,9)(2,1)(5,2)。分析:根据l进行从小到大排序,当l相同时,原创 2016-04-25 12:52:55 · 772 阅读 · 0 评论 -
HDOJ1548(BFS)
大意:n层楼,坐电梯从a层到b层。第i层有一个数Ki,可以上到i+Ki层,可以下到i-K层。求最少几次能从a到b层。分析:BFS水题。代码:#include#include#include#includeusing namespace std;int n, a, b;int k[205];int e[205];queueq;int bfs(int x, int y)原创 2016-04-25 12:57:32 · 667 阅读 · 0 评论 -
HDOJ5650
大意:给出一个数字集合,对其所有子集进行异或操作,输出结果。分析:异或(xor):按位运算,相同为0,不同为1。每一个数出现的次数为C(n-1,n-1)+C(n-1,n-2)+...+C(n-1,1)+1=2^(n-1)。只要有1个以上的数结果必为0.代码:#include #includeusing namespace std;int a[1005];int main(){原创 2016-04-25 13:01:13 · 396 阅读 · 0 评论 -
HDOJ1003(DP)
大意:给一串数字,求最大子序列和。分析:暴力超时,DP求解。if(dp[j-1] 0) dp[j] = a[j] ; else dp[j] = dp[j-1]+a[j] ;代码:#include #includeusing namespace std;int main(){ int t,num=0; scan原创 2016-04-25 13:02:30 · 529 阅读 · 0 评论