题解
学习用
Ken12348
这个作者很懒,什么都没留下…
展开
-
P1177 【模板】快速排序
首先,我们需要知道快速排序的理论知识。快速排序,又名快排,嗯,具体实现是从以数组中第一个数据为基点,然后首先以数组的右边开始(至于为什么是从右边开始,后面会提)寻找比此基点小的(看你的需求,如果是要从小到大的话,就是从右边找比基点小的)数,然后退出来,再从数组最左边开始找,找比基点大的,我们这样一直递归下去,因为我们想要达到的是数组左边的数据都是比基点小右边都是比基点大的,最后把基点放入左右边的中点。随着递归的一点点深入,分割的数目也越来越少,这就达成了一个排序的效果。为什么要从右边开始寻找呢,...原创 2022-01-23 20:41:49 · 390 阅读 · 0 评论 -
P1111 修复公路
这一题主要的问题是,如何判断一个时间是可以让所有的村庄都互通的。我们可以知道的是,这样的时间一定是修复某个桥的时间,最多也就是花费时间最长的那个,因为我们是可以同时修补所有的桥的。我们可以使用结构体数组记录这三个数据,然后按照时间从小到大给他们排序,那么第一个满足所有村庄互通的时间就是所谓”最早时间”。那么怎么判断那个时间是可以让所有村庄互通的呢?我们设一个循环,每次循环在结构体数组中取出此道路修补需要的时间,然后再设一个循环,此循环中,我们开始建树,并且以上一个循环中取出的时间为时间限制,修补不...原创 2022-01-23 10:59:00 · 217 阅读 · 0 评论 -
P2078 朋友
我们计算出与小明是朋友的人的个数,再计算小红的,可以知道的是如果人数不一致,那么数目小的那个就是可组成一对的个数。依旧是并查集,因为有小明和小红两人,所以我们可以设立两个并查集数组。其他的就是普通的并查集建立了。代码如下:#include <stdio.h>#include <string.h>int pre[30000],pre1[30000];int fini(int t,int x)//并查集合并,因为我要建立两个并查集,所以我用t来把它们区分开{ ...原创 2022-01-23 10:22:59 · 125 阅读 · 0 评论 -
P1455 搭配购买
依旧是并查集为主,这一题我们还需要注意的是“尽量多价值的云”和“一些云朵是搭配买的”,一看到“尽量多价值的云”我们就应该能想到01背包问题,毕竟一般求局限内的最高什么什么值都是关于背包问题的。对于“一些云朵是搭配买的”,我们可以在把他们的总共所需钱放在他们的“根节点”中,然后需要注意的是,在把价钱加入根节点里后,自己节点里的值需要清零,不然的话,背包问题就不容易实现了。代码如下:#include <stdio.h>#include <string.h>int ...原创 2022-01-23 10:13:52 · 341 阅读 · 0 评论 -
P1551 亲戚
典型的并查集吧,将属于亲戚的放入一个“集合”中,也就是把他们全都放进同一个树里,最后要是想判断他们是否是亲戚的话,就去找他们的根节点,如果根节点相同,也就是处于同一棵树中,那么他们就是亲戚关系。注释中有详细解释。代码实现如下:#include <iostream>#include <cstring>using namespace std;int pre[10000];int findi(int x)//这个函数的作用是找出x的根节点{ if(pr...原创 2022-01-23 09:54:40 · 262 阅读 · 0 评论 -
P3367 【模板】并查集
题目描述如题,现在有一个并查集,你需要完成合并和查询操作。输入格式第一行包含两个整数N,M ,表示共有 N 个元素和 M 个操作。接下来 M 行,每行包含三个整数 Zi,Xi,Yi 。当 Zi=1 时,将 Xi 与 Yi 所在的集合合并。当 Zi=2 时,输出 Xi 与 Yi 是否在同一集合内,是的输出 Y ;否则输出 N 。输出格式对于每一个 Zi=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。输入输出样例输入 #1复制原创 2022-01-21 16:26:13 · 444 阅读 · 0 评论 -
P1229 遍历问题
题目描述我们都很熟悉二叉树的前序、中序、后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历,求它的后序遍历,相应的,已知一棵二叉树的后序遍历和中序遍历序列你也能求出它的前序遍历。然而给定一棵二叉树的前序和后序遍历,你却不能确定其中序遍历序列,考虑如下图中的几棵二叉树:所有这些二叉树都有着相同的前序遍历和后序遍历,但中序遍历却不相同。输入格式输A数据共两行,第一行表示该二叉树的前序遍历结果s1,第二行表示该二叉树的后序遍历结果s2。输出可能的中序遍历序列的总数,结果原创 2022-01-21 16:04:02 · 111 阅读 · 0 评论 -
P4913 【深基16.例3】二叉树深度
题目描述给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 1),如果是叶子节点,则输入0 0。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。最多有 10^6 个结点。输入格式无输出格式无输入输出样例输入 #172 73 64 50 00 00 00 0输出 #14建树也有一个技巧,我们可以使用结构体数组分别存储左右节点,因为这样刚好符合题意,第一个节点收第一行的左右子树,即下标为1的结构体数组,以原创 2022-01-21 15:29:23 · 376 阅读 · 0 评论 -
P1030 [NOIP2001 普及组] 求先序排列
题目描述给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树结点用不同的大写字母表示,长度≤8)。输入格式2行,均为大写字母组成的字符串,表示一棵二叉树的中序与后序排列。输出格式1行,表示一棵二叉树的先序。输入输出样例输入 #1BADCBDCA输出 #1ABCD首先我们可以知道的是,后序遍历序列的最后一位一定是根节点,即先序遍历序列的第一位,然后我们可以知道的一个抽象特性是“后序遍历序列的最后一位一定是此先序遍历序列的第一位”,以此为根据,我们以中序原创 2022-01-21 11:03:11 · 247 阅读 · 0 评论 -
P1305 新二叉树
题目描述输入一串二叉树,输出其前序遍历。输入格式第一行为二叉树的节点数 n。(1≤n≤26)后面 n行,每一个字母为节点,后两个字母分别为其左右儿子。空节点用 * 表示输入输出样例输入6abcbdicj*d**i**j**输出 #1abdicj二叉树的前序遍历。我主要说一说我的做法,肯定有别的更好的办法,我这里只陈述我的思路。首先我们需要了解到二叉树的建树方法。Bitree *creat(){ Bitree *t; .原创 2022-01-21 10:38:40 · 794 阅读 · 1 评论 -
P1827 [USACO3.4]美国血统 American Heritage
题目为:通过的代码为:#include <iostream>#include <cstring>using namespace std;void backi(string m,string f){ if(f.empty)//当前此为前序遍历序列分割出的左子树序遍历序列为空的时候,代表此子树已经分割完 return; char s=f[0];//前序遍历序列的首位字符,即为此树枝的根节点 int i=m.find(s.原创 2022-01-18 22:06:13 · 60 阅读 · 0 评论 -
P1219 [USACO1.5]八皇后 Checker Challenge
题目是这样的:题目要求我们找到一系列的排列方式,要求是此位置的每一行每一列且两条对角线的范围内只能存在一个棋子,棋盘的规模是n*n。可以知道这样的题目可以使用dfs求出。可光知道dfs还不行,还要能够根据题目更改细节。此题我们不必要死板的用一个数组一个一个位置的去标记位置不可用。我试过,答案是对的,超时了……而且那样内存占用也会相对较多。所以我们可以该换一下思维,你想,它要求的是行列和对角线不能用,那干脆就直接使用几个数组用来标记行、列和对角线。我们可以使用某些数使得这几个数组中的下标拥有唯一性原创 2022-01-17 22:13:03 · 324 阅读 · 0 评论