<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Mai___的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Mai___</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Mai___]]></copyright><item><title><![CDATA[激光炸弹注释]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/122592329</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/122592329</guid><author>Mai___</author><pubDate>Thu, 20 Jan 2022 00:01:56 +0800</pubDate><description><![CDATA[首先要弄清楚题目是什么意思

如上图现在有一个3*3的炸弹爆炸范围，图中的线与线之间的交叉点就是建筑物
如果这个建筑物也就是交叉点在爆炸范围的边上，那么这个建筑物是不会被摧毁的
所以想要摧毁的建筑物最多也就是价值最大，就要如同上图中的2号红色框一样进行轰炸
这样就可以轰炸最多R * R，也就是9个建筑物
弄清楚题意之后，思路也就出来了
前缀和算法来存储二维前缀和，然后通过容斥定理遍历每一个大小为R * R的矩阵（轰炸范围）
找到价值最大的那一个输出即可，代码如下
#include&lt;iostream&.]]></description><category></category></item><item><title><![CDATA[蓝桥杯—带分数]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/122383226</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/122383226</guid><author>Mai___</author><pubDate>Sat, 08 Jan 2022 17:33:34 +0800</pubDate><description><![CDATA[暴力思路：
首先我们观察样例
100 = 3 + 69258/714
转化为n = a + b/c
n是题目中给出的数据，我们就只需要对a,b,c进行枚举即可
我们通过递归列举出1~9的全排列
然后从第一个排列开始，将其划分为三段，分别对应三个数
比如说123456789
现在取a = 1;b = 5;c = 3
那么a = 1
b = 23456
c = 789
这样分别对a，b，c取不同的位数，我们就可以列举出123456789中a,b,c的所有取数情况
然后分别代入式子n = a + b/c判断等式.]]></description><category></category></item><item><title><![CDATA[递归实现指数型、排列型、组合型枚举]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/122355168</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/122355168</guid><author>Mai___</author><pubDate>Fri, 07 Jan 2022 00:25:29 +0800</pubDate><description><![CDATA[#include&lt;iostream&gt;

using namespace std;

const int N = 20;
int st[N];
int n;

void dfs(int u)//当前正在填的位数 
{
	if(u &gt; n){//边界，此时已经填完了n位
		for(int i = 1;i &lt;= n;i++){
			if(!st[i])
				continue;
			cout &lt;&lt; i &lt;&lt; ' ';
		}
		puts("");
		r.]]></description><category></category></item><item><title><![CDATA[有依赖的背包问题（C语言）]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/121177886</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/121177886</guid><author>Mai___</author><pubDate>Sat, 06 Nov 2021 17:34:53 +0800</pubDate><description><![CDATA[思路就是

]]></description><category></category></item><item><title><![CDATA[完全背包(C语言)]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/121004737</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/121004737</guid><author>Mai___</author><pubDate>Wed, 27 Oct 2021 23:45:05 +0800</pubDate><description><![CDATA[完全背包
与01背包不同之处就在于
它的物品可以取用无数次
可以研究一下的它的状态转移方程
所以从图中的推导就可以看出
将01背包滚动数组的逆序更新转换为顺序更新就行
因为根据状态转移方程可以看出

用到的是第i行的数据，所以需要顺序更新滚动数组
代码如下
#include&lt;stdio.h&gt;
int f[2000];
int main()
{
	int n,m;
	scanf("%d%d",&amp;n,&amp;m);
	for(int i = 0;i &lt; n;i++){
		int .]]></description><category></category></item><item><title><![CDATA[多重背包问题的二进制优化（C语言）]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/120956008</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/120956008</guid><author>Mai___</author><pubDate>Mon, 25 Oct 2021 17:47:46 +0800</pubDate><description><![CDATA[之前一直不理解，为什么多重背包与01背包是类似的
用朴素法解决多重背包时，操作的集合分为不取i物品，取一个i物品，取两个i物品……取s个物品
所以解题的思路就是在01背包的基础上再加一重循环，将以上集合的全部列举出来，选择其中的价值最大值
代码如下
#include&lt;stdio.h&gt;
int v[1005],w[1005],s[1005],dp[1005];
int main()
{
	int n,m,i,j,k;
	scanf("%d%d",&amp;n,&amp;m);
	for(i = .]]></description><category></category></item><item><title><![CDATA[01背包的朴素解法及优化（C语言）]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/120895324</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/120895324</guid><author>Mai___</author><pubDate>Thu, 21 Oct 2021 22:09:48 +0800</pubDate><description><![CDATA[直接上题

先说朴素的想法
我认为动态规划的题目，都是要用到每一步的答案，将每一步的答案作为解题的线索
那么题目让我们考虑有四个物品，分别告诉了你四个物品的体积和价值，且每个物品的数量只有一个
让你利用这些条件找出一种物品序列，使其放入容量为5的背包后的价值最大
那我直接搬出朴素的解法
就是创建一个二维数组f[ i ][ j ]
i表示物品的编号，j表示背包的容量，每一个f的值就代表往容量为j的背包中放入1~i号物品所能达到的最大价值
那么创建好这个二维数组之后，就要开始对它进行赋值
赋值的顺序是从左到右，]]></description><category></category></item><item><title><![CDATA[二叉树的四种遍历(C语言)]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/120460374</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/120460374</guid><author>Mai___</author><pubDate>Fri, 24 Sep 2021 18:11:32 +0800</pubDate><description><![CDATA[#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

typedef char ElementType;
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

BinTree CreatBinTree(); /* 实现细节忽略 */
void I]]></description><category></category></item><item><title><![CDATA[搜索树判断(C语言)]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/120310941</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/120310941</guid><author>Mai___</author><pubDate>Wed, 15 Sep 2021 16:37:40 +0800</pubDate><description><![CDATA[题目如下

我整个题目的思路比较简单
就是一个基本的建立二叉搜索树
然后将题目输入的前序序列保存进一个数组a
再将插入二叉搜索树中的元素进行前序遍历输入进一个数组b
有个地方需要注意：由于二叉搜索树的建立是左子树小于根结点小于右子树
故镜像二叉树需要将二叉搜索树中的元素进行右子树在前左子树在后的递归才能得到镜像二叉树的前序序列
①若a与b相等，则提示输入的序列为某棵二叉搜索树的序列
②若a与b的镜像序列相等，则提示输入的序列为某棵镜像二叉搜索树的序列
③若a与b的两个遍历序列都不相等，则不是题示输入不是一棵]]></description><category></category></item><item><title><![CDATA[还原二叉树(C语言实现)]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/120233601</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/120233601</guid><author>Mai___</author><pubDate>Sat, 11 Sep 2021 10:05:56 +0800</pubDate><description><![CDATA[就把这个题目当作建树的练手题了
代码如下
#include&lt;stdio.h&gt;
#include&lt;malloc.h&gt;
typedef struct node{
	char data;
	struct node* left;
	struct node* right;
}Treenode,*NodeP;
char Pre[51],Mid[51];
int Position(char data,char Mid[],int n); 
 
NodeP Insert(NodeP root,ch.]]></description><category></category></item><item><title><![CDATA[汉诺塔的非递归实现（C语言）]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/119842205</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/119842205</guid><author>Mai___</author><pubDate>Sat, 21 Aug 2021 17:24:23 +0800</pubDate><description><![CDATA[题目如图

整个算法的实质就是
将问题不断细分,
按照顺序压入栈
那么现在存在几个问题
①栈的元素是什么，应该如何定义
栈的元素应该是一个一个的结构体，结构体成员中应该含有当前的待操作圆盘
数n，以及A,B,C三根杆（按照起始、中转、目标放好）
②循环的实现
当栈顶元素的待操作圆盘数为1时，打印 起始杆-&gt;目标杆（可以理解为只有一个圆盘的操作，只需要将该圆盘移动至目标杆即可）
当栈顶元素的待操作圆盘数不为1时，对其进行问题的细分，例如当前
的操作目标是将n个圆盘从A移动至C，那么就将问题细分为
1、将]]></description><category></category></item><item><title><![CDATA[堆中的路径(C语言)]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/119759612</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/119759612</guid><author>Mai___</author><pubDate>Tue, 17 Aug 2021 16:35:55 +0800</pubDate><description><![CDATA[题如上图
思路：
①用数组来代替堆的建立
②动态建堆（一开始直接往数组中插入全部的元素，然后从第一个非叶子结点逐个与其左右结点进行替换，发现存在漏洞，当你从下往上进行完一轮排查替换后，新的堆并不一定符合堆的定义，发现是因为刚开始的元素本就是乱序，并没有结点之间的大小关系，所以从顶上淘汰下来的元素并不一定就与底部元素构成根结点大于左右结点的关系，所以只能动态建堆）
①的实现：
因为题目所给的数据是从一开始，所以将数组的首元素置为可能出现的最小值，从一开始输入元素
②的实现：
假设当前结点为i，那么它的根结点.]]></description><category></category></item><item><title><![CDATA[PTA练习4.2 平衡二叉树的根 (25 分)]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/119139360</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/119139360</guid><author>Mai___</author><pubDate>Tue, 27 Jul 2021 13:46:20 +0800</pubDate><description><![CDATA[将给定的一系列数字插入初始为空的AVL树，请你输出最后生成的AVL树的根结点的值。

输入格式:
输入的第一行给出一个正整数N（≤20），随后一行给出N个不同的整数，其间以空格分隔。

输出格式:
在一行中输出顺序插入上述整数到一棵初始为空的AVL树后，该树的根结点的值。

输入样例1:
5
88 70 61 96 120
输出样例1:
70
输入样例2:
7
88 70 61 96 120 90 65
输出样例2:
88]]></description><category></category></item><item><title><![CDATA[根据后序和中序遍历输出先序遍历（C语言）]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/116402610</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/116402610</guid><author>Mai___</author><pubDate>Tue, 04 May 2021 17:25:40 +0800</pubDate><description><![CDATA[本题要求根据给定的一棵二叉树的后序遍历和中序遍历结果，输出该树的先序遍历结果。
输入格式:
第一行给出正整数N(≤30)，是树中结点的个数。随后两行，每行给出N个整数，分别对应后序遍历和中序遍历结果，数字间以空格分隔。题目保证输入正确对应一棵二叉树。
输出格式:
在一行中输出Preorder: 以及该树的先序遍历结果。数字间有1个空格，行末不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
Preorder: 4 1 3 2 6 5 7

思路:
其实就是.]]></description><category></category></item><item><title><![CDATA[表达式转换（C语言实现）]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/115709351</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/115709351</guid><author>Mai___</author><pubDate>Wed, 14 Apr 2021 21:15:45 +0800</pubDate><description><![CDATA[算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法，即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。
输入格式: 输入在一行中给出不含空格的中缀表达式，可包含+、-、*、\以及左右括号()，表达式不超过20个字符。
输出格式: 在一行中输出转换后的后缀表达式，要求不同对象（运算数、运算符号）之间以空格分隔，但结尾不得有多余空格。
输入样例: 2+3*(7-4)+8/4 输出样例: 2 3 7 4 - * + 8 4 / +

本题的思路：
该.]]></description><category></category></item><item><title><![CDATA[一元多项式的乘法与加法运算]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/115336235</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/115336235</guid><author>Mai___</author><pubDate>Tue, 30 Mar 2021 21:21:46 +0800</pubDate><description><![CDATA[设计函数分别求两个一元多项式的乘积与和。
输入格式:
输入分2行，每行分别先给出多项式非零项的个数，再以指数递降方式输入一个多项式非零项系数和指数（绝对值均为不超过1000的整数）。数字间以空格分隔。
输出格式:
输出分2行，分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔，但结尾不能有多余空格。零多项式应输出0 0。
输入样例:
4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1
输出样例:
15 24 -25 22 30 21 -10 20 -]]></description><category></category></item><item><title><![CDATA[最长连续递增子序列]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/115321184</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/115321184</guid><author>Mai___</author><pubDate>Tue, 30 Mar 2021 11:27:40 +0800</pubDate><description><![CDATA[给定一个顺序存储的线性表，请设计一个算法查找该线性表中最长的连续递增子序列。例如，(1,9,2,5,7,3,4,6,8,0)中最长的递增子序列为(3,4,6,8)。
输入格式:
输入第1行给出正整数n（≤10^5）；第2行给出n个整数，其间以空格分隔。
输出格式:
在一行中输出第一次出现的最长连续递增子序列，数字之间用空格分隔，序列结尾不能有多余空格。
输入样例：
15
1 9 2 5 7 3 4 6 8 0 11 15 17 17 10
输出样例：
3 4 6 8
#include &lt;stdio.h]]></description><category></category></item><item><title><![CDATA[邻接矩阵存储图的深度优先遍历]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/115221964</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/115221964</guid><author>Mai___</author><pubDate>Fri, 26 Mar 2021 00:04:36 +0800</pubDate><description><![CDATA[函数接口定义：
void DFS( MGraph Graph, Vertex V, void (*Visit)(Vertex) );
其中MGraph是邻接矩阵存储的图，定义如下：
typedef struct GNode *PtrToGNode;
struct GNode{
    int Nv;  /* 顶点数 */
    int Ne;  /* 边数   */
    WeightType G[MaxVertexNum][MaxVertexNum]; /* 邻接矩阵 */
};
typedef Pt]]></description><category></category></item><item><title><![CDATA[是否二叉搜索树]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/115183107</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/115183107</guid><author>Mai___</author><pubDate>Wed, 24 Mar 2021 17:51:42 +0800</pubDate><description><![CDATA[本题要求实现函数，判断给定二叉树是否二叉搜索树。
函数接口定义：
bool IsBST ( BinTree T );
其中BinTree结构定义如下：

typedef struct TNode *Position;
typedef Position BinTree;
struct TNode{
    ElementType Data;
    BinTree Left;
    BinTree Right;
};

函数IsBST须判断给定的T是否二叉搜索树，即满足如下定义的二叉树：
定义：一个二叉搜索]]></description><category></category></item><item><title><![CDATA[习题3.12 另类循环队列 (20 分)]]></title><link>https://blog.youkuaiyun.com/Mai___/article/details/115127827</link><guid>https://blog.youkuaiyun.com/Mai___/article/details/115127827</guid><author>Mai___</author><pubDate>Tue, 23 Mar 2021 16:04:40 +0800</pubDate><description><![CDATA[如果用一个循环数组表示队列，并且只设队列头指针Front，不设尾指针Rear，而是另设Count记录队列中元素个数。请编写算法实现队列的入队和出队操作。
函数接口定义：
bool AddQ( Queue Q, ElementType X );
ElementType DeleteQ( Queue Q );

其中Queue结构定义如下：
typedef int Position;
typedef struct QNode *PtrToQNode;
struct QNode {
    ElementType]]></description><category></category></item></channel></rss>