自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(142)
  • 资源 (2)
  • 收藏
  • 关注

原创 POJ 3157 Java vs C++(字符串)

DescriptionApologists of Java and C++ can argue for hours proving each other that their programming language is the best one. Java people will tell that their programs are clearer and less prone to errors, while C++ people will laugh at their inability to

2021-02-28 20:48:52 910 2

原创 HDU 2682 Tree(最小生成树)

Problem DescriptionThere are N (2<=N<=600) cities,each has a value of happiness,we consider two cities A and B whose value of happiness are VA and VB,if VA is a prime number,or VB is a prime number or (VA+VB) is a prime number,then they can be conne

2021-02-28 20:39:49 99

原创 HDU 6114 Chess

Problem Description車是中国象棋中的一种棋子,它能攻击同一行或同一列中没有其他棋子阻隔的棋子。一天,小度在棋盘上摆起了许多車……他想知道,在一共N×M个点的矩形棋盘中摆最多个数的車使其互不攻击的方案数。他经过思考,得出了答案。但他仍不满足,想增加一个条件:对于任何一个車A,如果有其他一个車B在它的上方(車B行号小于車A),那么車A必须在車B的右边(車A列号大于車B)。现在要问问你,满足要求的方案数是多少。Input第一行一个正整数T,表示数据组数。对于每组数据:一行,两个正整数N

2021-02-28 20:15:16 90

原创 组合数取余

组合数C(n,m)%k的计算方法一递推公式 C(n,m)=C(n-1,m)+C(n-1,m-1)一边计算一边取余时间复杂度O(n2) 适用范围m,n<1000,k为自然数#include<bits/stdc++.h>using namespace std;int c[1001][1001];int main(){ int n,m,k; scanf("%d%d%d",&n,&m,&k); for(int i=1;i<=n;i++

2021-02-28 20:07:11 483

原创 POJ 2505 A multiplication game(博弈)

DescriptionStan and Ollie play the game of multiplication by multiplying an integer p by one of the numbers 2 to 9. Stan always starts with p = 1, does his multiplication, then Ollie multiplies the number, then Stan and so on. Before a game starts, they d

2021-02-28 19:17:22 173

原创 堆中的路径

描述:将一系列给定数字插入一个初始为空的小顶堆H[]。随后对任意给定的下标i,打印从H[i]到根结点的路径。输入格式:每组测试第1行包含2个正整数N和M(≤1000),分别是插入元素的个数、以及需要打印的路径条数。下一行给出区间[-10000, 10000]内的N个要被插入一个初始为空的小顶堆的整数。最后一行给出M个下标。输出格式:对输入中给出的每个下标i,在一行中输出从H[i]到根结点的路径上的数据。数字间以1个空格分隔,行末不得有多余空格。输入样例:5 346 23 26 24 105

2021-02-28 18:59:45 82

原创 哈夫曼树的基本概念

带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值Wk,从根节点到每个叶子结点的长度为Lk,则每个叶子结点的带权路径长度之后就是权值乘长度累加哈夫曼树:WPL最小的二叉树哈夫曼树的特点没有度为1的结点n个叶结点的哈夫曼树共有2*n-1个结点哈夫曼树的任意非叶结点的左右子树交换后仍是哈夫曼树对于同一组数据可能构造出不同的哈夫曼树...

2021-02-28 17:30:50 176

原创 堆的删除

删除大顶堆的根结点将堆的最后一位补至堆顶,然后对堆进行调整将根结点的两个子结点中最大的与最后一位比较,将较大的放至根节点,若放的不是最后一位,那么以刚才的子结点为根结点,重复之前的操作。typedef int ElementType;struct Heap{ ElementType *data; int size,capacity;};void DeleteMax(Heap *h){ int parent,child; if(h->size==0) return; El

2021-02-28 17:15:42 833

原创 堆排序

#include<iostream>using namespace std;void minheap_fixdown(int *a,int i,int n){ int left=2*i+1; int right=2*i+2; if(left>=n) return; int min=left; if(right<n) if(a[right]<a[left]) min=right; if(a[i]<a[min]) return; els

2021-02-27 21:13:00 78

原创 堆的遍历

void inorder(int a[],int i,int n){ if(i>=n) return; inorder(a,2*i,n); cout<<a[i]<<" "; inorder(a,2*i+1,n);}void preorder(int a[],int i,int n){ if(i>=n) return; cout<<a[i]<<" "; inorder(a,2*i,n); inorder(a,2*i+

2021-02-27 21:11:15 718

原创 堆的建立

堆是一种特殊的完全二叉树堆分为大顶堆和小顶堆大顶堆是每个结点都大于其左右结点的完全二叉树大顶堆是每个结点都小于其左右结点的完全二叉树建立一个大顶堆先建立一个空堆,将数向其中插入。将小于插入的数的数向下挪typedef int ElementType;struct Heap{ ElementType *data; int size,capacity;};Heap *CreateMaxHeap(int MaxSize){ Heap *h=(Heap *)malloc(sizeof(

2021-02-27 21:00:33 124 1

原创 Complete Binary Search Tree

descriptionA Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties:The left subtree of a node contains only nodes with keys less than the node’s key.The right subtree of a node contains only nodes with keys

2021-02-27 19:26:22 145

原创 Root of AVL Tree

descriptionAn AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child subtrees of any node differ by at most one; if at any time they differ by more than one, rebalancing is done to restore this property. Figures 1-4

2021-02-27 15:46:56 123

原创 是否同一棵二叉搜索树

描述给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。输入格式:输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需

2021-02-27 09:31:37 297

原创 平衡二叉树的插入

先看一下二叉搜索树的插入平衡二叉树的调整平衡二叉树的插入是二者的综合#include<iostream>#include<cstdlib> using namespace std;typedef struct AVLNode *AVLTree;typedef int ElementType;struct AVLNode{ ElementType data; AVLTree left; AVLTree right; int he

2021-02-27 09:31:11 2019 4

原创 平衡二叉树的调整

平衡二叉树都通过旋转来调整LL型造成不平衡的结点在从上往下第一个不平衡结点的左子树的左子树上#include<iostream>using namespace std;typedef struct AVLNode *AVLTree;typedef int ElementType;struct AVLNode{ ElementType data; AVLTree left; AVLTree right; int height;};AVL

2021-02-26 20:50:28 151

原创 平衡二叉树的基本概念

二叉搜索树的结点按照不同的次序插入,会有不同的深度和平均查找长度ASL。平衡二叉树(AVL树):空树或者任一结点的左右子树高度差的绝对值不超过1,即|BF(T)|<=1平衡因子:BF(T)=hL-hR hL和hR为T左右子树的高度结点数为n的AVL树的最大高度为O(log2n)...

2021-02-26 18:49:58 334

原创 二叉搜索树的删除

首先需要找到要删除的结点,先进行查找需要删除的结点有三种情况叶结点:直接删除,并将其父结点的指针置为NULL只有一个子结点的结点:将其父结点的指针指向其的子结点有两个子结点的结点:用右子树的最小元素或左子树的最大元素代替其//定义二叉树 typedef struct TreeNode *BinTree;typedef BinTree Position;typedef int ElementType;struct TreeNode{ ElementType data; BinTre

2021-02-26 18:09:22 127

原创 二叉搜索树的插入

若原树为空,生成并返回一个结点的二叉搜索树若不为空,X与树的根结点的键值相比较若X大,则向右子树插入若X小,则向左子树插入

2021-02-26 17:37:22 191 1

原创 malloc()函数用法

malloc函数是一个分配内存空间的函数需包含头文件 stdlib.h函数原型 void *malloc(unsigned int size)参数是一个无符号整型数字,是分配字节数的大小如果分配空间成功,则返回值指向分配内存的指针,否则返回空指针NULL分配完内存后,如果不需再使用,需要使用free()函数将内存释放,否则会造成内存泄漏。#include<cstdlib>#include<cstdio>int main(){ int *a; //申请内存

2021-02-26 17:28:16 199

原创 二叉搜索树的查找

查找某一值查找从根结点开始,如果树为空,返回NULL若搜索树非空,则根结点键值和X进行比较,并进行不同处理:若X小于根结点的键值,只需在左子树中继续搜索若X大于根结点的键值,只需在右子树中继续搜索若二者相等,搜索完成,返回指向此结点的指针//定义二叉树 typedef struct TreeNode *BinTree;typedef BinTree Position;typedef int ElementType;struct TreeNode{ ElementType data

2021-02-26 17:05:59 216

原创 二叉搜索树的基本概念

二叉搜索树,也称二叉排序树或二叉查找树二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质非空左子树的所有键值小于其根结点的键值非空右子树的所有键值大于其根结点的键值左、右子树都是二叉搜索树...

2021-02-26 16:43:15 182

原创 Tree Traversals Again

descriptionAn inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3);

2021-02-26 14:07:35 98

原创 List Leaves

descriptionGiven a tree, you are supposed to list all the leaves in the order of top down, and left to right.Input Specification:Each input file contains one test case. For each case, the first line gives a positive integer N (<=10) which is the tota

2021-02-26 10:46:53 66

原创 树的同构

给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构”的。例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A、B、G的左右孩子互换后,就得到另外一棵树。而图2就不是同构的。现给定两棵树,请你判断它们是否是同构的。输入格式:输入给出2棵二叉树树的信息。对于每棵树,首先在一行中给出一个非负整数N (≤10),即该树的结点数(此时假设结点从0到N−1编号);随后N行,第i行对应编号第i个结点,给出该结点中存储的1个英文大写字母、其左孩子结点的编号、右孩子结点

2021-02-26 00:28:03 128

原创 求二叉树的高度

递归实现二叉树的高度为左右子树两边的高度中的最大值加1#include<iostream>using namespace std;typedef struct TreeNode *BinTree;typedef BinTree Position;struct TreeNode{ int data; BinTree left; BinTree right;};int GetHeight(BinTree bt){ if(bt) return max(GetHeig

2021-02-25 21:38:23 80

原创 遍历二叉树的叶子结点

递归实现遍历二叉树的所有叶子结点#include<iostream>using namespace std;typedef struct TreeNode *BinTree;typedef BinTree Position;struct TreeNode{ int data; BinTree left; BinTree right;};void leaves(BinTree bt){ if(bt) { if(!bt->left&&!bt-

2021-02-25 21:32:57 2315

原创 二叉树的遍历

先序遍历访问根结点先序遍历左子树先序遍历右子树递归实现void PreOrderTraversal(BinTree bt){ if(bt) { cout<<bt->data; PreOrderTraversal(bt->left); PreOrderTraversal(bt->right); }}非递归实现使用栈遇到一个结点,访问其并就将它压入栈中先序遍历其左子树当左子树遍历完后,从栈中弹出一个结点,先序遍历其右子树void

2021-02-25 21:25:21 70

原创 二叉树的存储

顺序存储使用数组进行存储比较适合完全二叉树使用结点i的父结点的序号是i/2 i非根结点结点i的左子结点的序号是2i (2i<=n,否则无左子结点)结点i的右子结点的序号是2i+1 (2i+1<=n,否则无右子结点)对于非完全二叉树,可将无结点的位置记为空链表存储对于一般二叉树,使用顺序存储会造成空间的浪费链式存储是使用链表进行存储typedef struct TreeNode *BinTree;typedef BinTree Position;struct Tre

2021-02-25 20:14:56 94

原创 二叉树的基本概念

二叉树的定义二叉树:一个有穷的结点的集合。这个集合可以为空若不为空,则它是由根结点和称为其左子树和右子树的两个不相交的二叉树组成注意左右子树有顺序之分斜二叉树:只有左子树或只有右子树完美二叉树:除最底层的叶节点,其它结点均有左右子树完全二叉树: 只有最底层不全的完美二叉树二叉树的性质一个二叉树第i层的最大结点数为:2^(i-1)深度为k的二叉树有最大结点数为:2^k-1对任何非空二叉树,若n0表示叶结点的个数,n2表示深度为2的结点的个数,那么有n0=n2+1...

2021-02-25 20:00:29 154

原创 树的基本概念

树的定义树:n个节点构成的有限集合树的性质子树是不相交的;除了根节点外,每个节点有且仅有一个父节点;一棵N个节点的数有N-1条边树的基本概念结点的度:结点的子树个数树的度:树中所有结点中最大的度数叶节点:度为0的节点父节点:有子树的节点子节点:若A是B的父节点,则称B是A的子节点兄弟节点:具有同一父节点的各节点彼此是兄弟节点结点的层次:规定根结点在1层,其它结点的层数是其父结点的层数加1树的深度:树中所有结点中的最大层次是这棵树的深度...

2021-02-25 19:51:29 102

原创 C++测试程序运行时间

#include<cstdio>#include<ctime>clock_t start,stop;double duration;int main(){ //准备工作,输入数据等 start=clock(); //开始计时 //测试的代码 stop=clock(); //结束计时 duration=((double)(stop-start))/CLK_TCK; printf("%lf",duration); return

2021-02-25 16:35:26 135

原创 七段码(dfs,并查集)

建图,dfs每个灯可以亮或者不亮,枚举2^7#include<iostream>using namespace std;const int N=8;int map[N][N],fa[N],vis[N],ans;int getfa(int i) //寻找根节点 { if(fa[i]==i) return i; return fa[i]=getfa(fa[i]); //压缩路径 }void dfs(int k){ if(k>7.

2021-02-24 22:28:31 614 1

原创 2020第十一届蓝桥杯C/C++ 省赛A组 题解

A624#include<iostream>using namespace std;int main(){ int cnt=0; for(int i=1;i<=2020;i++) { int tmp=i; while(tmp) { if(tmp%10==2) cnt++; tmp/=10; } } cout<<cnt; return 0;}B1216587#include<iostream>

2021-02-24 22:26:10 7027 6

原创 子串分值

思路可以枚举,三重循环,这么算,n需小于100,显然不行每一个字母贡献的子串数,为其下标分别与前一个相同字母下标和后一个相同字母下标相减的绝对值相乘,再累计每一个字母即为答案比如图中这个字符串,记算4号位a的贡献子串数前一个a下标为1,后1个为6 (4-1)*(6-4)=6解释一下 4-1 对应着bca(234号) 6-4对应着ab(45号)分别以bca为起始位置,ba为终止位置的子串都只包含4号a,且是全部只包含4号a的子串即为bca bcab ca cab a ab注意初始,..

2021-02-24 19:48:21 2179 8

原创 多重背包

一共m个物品,背包最大体积为t。每个物品有对应着体积和价值,每个物品能使用一定次,求背包中最大的价值f[i][j]表示使用前i个物品,最大体积为j的情况下,所装的最大值。与01背包不同的是,一个物品可以使用一定的次数。总体思路与01背包相同,加一个循环,第k个第i物品要不要使用(也可以这么理解,k第i个物品,重新编号,相当于是第i个物品,第i+1个物品,第i+2个物品…第i+k-1个物品。所有物品重新编号,就又是01背包问题)#include<bits/stdc++.h>using na

2021-02-24 12:01:26 73

原创 完全背包

一共m个物品,背包最大体积为t。每个物品有对应着体积和价值,每个物品可以无限使用,求背包中最大的价值f[i][j]表示使用前i个物品,最大体积为j的情况下,所装的最大值。可以选择装第i个物品和不装第i个物品,取二者的最大值。不装第i个,那么就是使用前i-1个物品体积不超过j的最大价值;装第i个物品,就是使用前i-1个物品体积不超过j减去第k个i个物品的体积的最大价值再加上k个第i个物品的价值。f[i][j]等于 f[i-1][j-kw[i]+kv[i]的最大值 0<=k<=j/w[i]

2021-02-24 11:53:49 71

原创 01背包

一共m个物品,背包最大体积为t。每个物品有对应着体积和价值,每个物品只能使用一次,求背包中最大的价值f[i][j]表示使用前i个物品,最大体积为j的情况下,所装的最大值。可以选择装第i个物品和不装第i个物品,取二者的最大值。不装第i个,那么就是使用前i-1个物品体积不超过j的最大价值;装第i个物品,就是使用前i-1个物品体积不超过j减去第i个物品的体积的最大价值再加上第i个物品的价值。转移方程 f[i][j]=max(f[i-1][j],f[i-1][j-w[i]]+v[i])观察到,第i-1行,至

2021-02-24 11:34:42 76

原创 OpenJudge 6047 分蛋糕(dp)

描述有一块矩形大蛋糕,长和宽分别是整数w 、h。现要将其切成m块小蛋糕,每个小蛋糕都必须是矩形、且长和宽均为整数。切蛋糕时,每次切一块蛋糕,将其分成两个矩形蛋糕。请计算:最后得到的m块小蛋糕中,最大的那块蛋糕的面积下限。假设w= 4, h= 4, m= 4,则下面的切法可使得其中最大蛋糕块的面积最小。假设w= 4, h= 4, m= 3,则下面的切法会使得其中最大蛋糕块的面积最小:输入共有多行,每行表示一个测试案例。每行是三个用空格分开的整数w, h, m ,其中1 ≤ w, h, m ≤ 2

2021-02-24 10:59:31 258

原创 OpenJudge 1757 神奇的口袋(dp)

描述有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。输入输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。

2021-02-23 21:14:35 196

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除