- 博客(160)
- 收藏
- 关注
原创 PAT A1126 Eulerian Path 题解
题面已经把证明方法给出来了,如果一个连通图的所有结点的度都是偶数,那么它就是Eulerian,如果除了两个结点的度是奇数其他都是偶数,那么它就是Semi-Eulerian,否则就是Non-Eulerian。所以我们只需要用邻接表来存储图,G[u].size()就是顶点u的度,统计度数为奇数的点的数量即可判断,但这题存在一个小坑,给出的图并不见得是连通图,所以还需要先dfs判断连通性,非连通图则直接判定为Non-Eulerian。判断给定的无向图是欧拉图、半欧拉图还是非欧拉图。
2025-03-21 10:38:26
309
原创 PAT A1162 Postfix Expression 题解
然后是N行,每行给出一个结点的信息(第i行对应第i个结点),格式为data left_child right_child,其中data是不超过10个字符的字符串,left_child和right_child分别是该结点的左右子结点的下标。2、左子树为空,右子树不为空,此时按照后缀表达式的规则,应该先输出根节点再输出右子树,所以返回 “(” + tree[id].data + dfs(tree[id].right) + “)”也可以用不带不带返回值的dfs,直接在递归的过程中输出,代码如下。
2025-03-19 15:57:56
224
原创 PAT A1142 Maximal Clique 题解
clique(团)是一个点集,在一个无向图中,这个点集中任意两个不同的点之间都是相连的。maximal clique是一个clique,这个clique不可以再加入任何一个新的结点构成新的clique。然后给出m条询问,每个询问是一个点集合,问这个点集合是否是maximal clique、是否是clique。之后判断是否是maximal,即遍历所有不在集合中的剩余的点,看是否存在一个点满足和集合中所有的结点相连,最后如果都满足,那就输出Yes表示是Maximal clique。
2025-03-19 10:57:39
164
原创 PAT A1125 Chain the Ropes 题解
因为所有的绳子最终都要串在一起,每次选取两个绳段串联后的长度都等于(旧的绳子长度+新的绳子长度)/2,所以越是早加入绳子长度中的段,被对折的次数就越多,所以既然希望最终得到的绳子长度是最长的,就必须让长的段对折次数尽可能的少。所以将所有段从小到大排序,然后从头到尾从小到大分别将每一段依次加入结绳的绳子中,最后得到的结果才会是最长的结果。给定一段一段的绳子,你需要把它们串成一条绳。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。给定N段绳子的长度,你需要找出它们能串成的绳子的最大长度。
2025-03-18 16:04:01
314
原创 PAT A1148 Werewolf - Simple Version题解
然后在此假设下检查每个人的说法是否和假设的情况有冲突(a[k] * flag[abs(a[k])] < 0则说谎,因为如果没说谎则a[k]和flag[abs(k)]同为正数或者负数),将说谎者存入数组lie。完毕后,检查lie数组的大小即说谎者是否为两人,并且一个是狼人一个是人类(即flag[lie[0]] + flag[lie[1]] == 0),如果满足,则i和j是答案。用数组a来存放每个人的说法,用两层循环来枚举假设i和j是狼人,用数组flag来标识每个人的身份,1为人类,-1为狼人,
2025-03-18 15:37:38
292
原创 PAT A1130 Infix Expression
要注意到题目并没有直接告诉你哪一个节点是根节点,所以首先需要根据所有孩子结点编号寻找1~n中没有出现过的编号标记为root,即树的根结点。然后进行从root结点开始dfs~dfs递归拼接 “(” + 左子树 + 根 + 右子树 + “)”题目大意:给一个二叉树,输出中缀表达式,且加上括号表示运算的优先级。
2025-03-12 17:52:57
293
原创 如何将本地已有的仓库上传到gitee (使用UGit)
本文介绍如何使用UGit将本地项目上传Unity项目至Gitee仓库,以及本人在使用过程中遇到的问题,时如何解决的
2025-03-09 20:01:19
375
原创 PAT甲级 1103 Integer Factorization
给三个正整数N、K、P,将N表示成K个正整数(可以相同,递减排列)的P次方和,如果有多种方案,选择底数n1+…+nk最大的方案,如果还有多种方案,选择底数序列的字典序最大的方案
2025-02-23 20:12:01
161
原创 PAT甲级 A1105 Spiral Matrix
将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”~所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充~要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值
2025-02-23 13:57:02
231
原创 PAT甲级 1017 Queueing at Bank
题目大意:有n个客户,k个窗口。已知每个客户的到达时间和需要的时长,如果有窗口就依次过去,如果没有窗口就在黄线外等候(黄线外只有一个队伍,先来先服务),求客户的平均等待时长。银行开放时间为8点到17点,再8点之前不开门,8点之前来的人都要等待,在17点后来的人不被服务。用结构体表达客户的到达时间和办理业务时间,首先把所有hh:mm:ss格式的时间全化成以当天0点为基准的秒数,这样方便处理。注意晚于17:00的客户不算在内。对客户按照到达时间从小到大进行排序。使用一个优先队列维护窗口办理完业务的时间。
2025-02-23 13:27:05
242
原创 牛客周赛73 D题 小红的01子序列构造(easy)前缀和+二分解法
可以考虑使用前缀和+二分的思路。分析可得知,一个区间内01序列的个数,贡献由区间内的1得出,而每个1可以做出的贡献则由其前面的0的个数决定,显然可以用前缀和分别维护0的个数和1的个数。我们也可以预处理出每个1的贡献,然后计算出区间内的贡献和即可。这个也可以由前缀和实现。具体需要维护以下前缀和数组:1、pre1[i]为区间[1, i]中1的个数;2、pre0[i]为区间[1, i]中0的个数;3、sum[i]为区间[1, i]中01序列的总数。
2025-01-05 13:27:10
302
原创 牛客周赛 Round 68 E-博丽神社的巫女(二)
题目还要求输出一个具体方案,只需要在计算时记录前驱状态即可,具体的说就是如果f[i][j] = 1是通过f[i - 1][j - x] = 1得到的,那么记录下f[i][j]的前驱状态为f[i - 1][j - x],同时记录下第i组得到数字x的操作次数(a[i]除以2几次得到的x)。最后输出具体方案的时候从末尾状态f[n][m]向前回溯即可。设f[i][j]为在前i组数中是否可以凑出j,f[i][j] = 1表示可以,f[i][j] = 0表示不能。通过上面分析得到,这实际上是个分组背包问题。
2024-12-29 18:57:25
216
原创 牛客周赛 Round 66 E题 小苯的蓄水池(hard)
我们可以把每个区间的所有点的祖先结点都赋值为该区间最右端点i,在最开始的情况下每两个相邻的蓄水池之间都有一个隔板,所以我们初始化并查集所有的顶点i的根节点为他们本身。假设我们现在要拆除i和i+1之间的挡板,在我们这个并查集中也就相当于合并i和i+1的祖先结点(即合并i和i+1各自所在的这两个集合)。所以我们如果要拆除给定区间[l,r]内的所有挡板,体现在并查集上,就等价于把[l,r]从左往右进行并查集的合并,合并的同时将操作里涉及的区间进行统计。时间复杂度:O(n)
2024-12-29 18:18:19
247
原创 牛客周赛65 E、F题 降温
对于最大值的方案,看看当天是否可以与昨天构成一次寒潮(即a[i - 1] - x是否大于等于题目规定的温度最小值),如果可以,则a[i] = a[i - 1] - x,如果不能,则将a[i]拉满(反正今天组不成了,拉满温度更有利于在后边构造出寒潮)对于最小值的方案,因为只要今天和昨天的温度差在x以内,则不会构成寒潮,并且为了尽量不和明天构成寒潮,则今天的温度又要尽可能低,所以b[i - 1] - x + 1自然就成了最好的选择,但是要注意不能低于题目规定的温度最小值。
2024-12-23 21:01:00
326
原创 牛客周赛65 D题 医生
现在小红对于每个病人的症状用一个长度为m的01串表示,第i个字符代表第i个身体部位的症状,0代表健康,1代表不健康。一共有k种药,每种药也用一个长度为m的01串表示,第i个字符为’1’代表该药可以治愈第i个部位的症状。使用dfs来暴搜答案,在dfs的过程中,对每一个药都考虑要和不要。对于每个病人,请你帮小红求出治愈该病人需要开的最少的药数量。
2024-12-23 20:05:06
170
原创 牛客周赛62 G题 小红的数轴移动(二) 个人题解
图建好之后就可以开始跑Dijsktra算法求从x到0的最短路了,但是这一题当中我们要注意的问题是,题目给出的规矩是每个a[i]只可以使用一次,所以在用a[i]建边的时候我们需要给边一个标识,用a[i]建的边标识为i,所以我们在使用Dijkstra求最短路的过程中,我们要记录每个最短路方案中所用到的边的标识,以防在同一个最短路方案中使用多次(并且最终输出方案的时候也用得上)。很显然a[i]是作为边权的,我们每输入一个a[i],都将a[i]按照题目规矩边权给[0, 200]建边。
2024-12-22 17:13:00
272
原创 牛客周赛64 个人题解
D题 小红和小紫的博弈游戏:小红和小紫拿到了一个2∗2的矩阵,她们准备在这个矩阵上玩一个博弈游戏。游戏的规则是:两人轮流操作,每次操作时选择两个相邻的正整数(相邻格子,不包括斜角),使它们同时减1。谁先无法操作谁就输了。小红先手操作,她想知道,两人都使用最优策略的情况下,谁将获得最终胜利?E题 小红的字符串重排:给定一个字符串s,将其重排为s1,使得s1和s的每个对应位置的字符都不相同,如果无解则输出-1。F题 小红的树上路径查询(easy):给定一棵树,给定一条点x和y的简单路径,请给出树上所有节
2024-12-22 16:21:39
786
原创 碰撞器触发事件(OnTriggerEnter/OnTriggerStay/OnTriggerExit)
在Unity中,触发器事件是当一个游戏对象进入、停留或离开另一个游戏对象的触发器碰撞器时发生的事件。这些事件分别是:OnTriggerEnter: 当其他Collider首次进入触发器时调用。OnTriggerStay: 当其他Collider停留在触发器中时每帧调用。OnTriggerExit: 当其他Collider离开触发器时调用。
2024-05-17 18:07:18
4037
原创 UVA297 Quadtrees 解题报告
以用四分树来表示一个黑白图像,方法是用根结点表示整幅图像,然后把行列各分成两等分,按照图中的方式编号,从左到右对应4个子结点。如果某子结点对应的区域全黑或者全白,则直接用一个黑结点或者白结点表示,如果既有黑又有白,则用一个灰结点表示,并且为这个区域递归建树。p表示中间结点,f表示黑色(full),e表示白色(empty)。这题我们同样可以不需要显式建树,可以使用隐式建树的办法,先序递归解析四分树,一边解析一边统计,开一个二维数组标记所有被涂黑的像素点,用以在合并第二棵树的时候对描黑的像素点判重。
2024-04-12 10:58:02
405
原创 UVA699 The Falling Leaves 解题报告
先序递归隐式建树,同时统计每一列的和。我们并不需要真的建树,在递归的过程中我们无需知道每个节点的具体编号,只需要知道当前节点列编号即可,为了方便实现,我们将整棵树的根节点视为0列,往左为-1列,往右为+1列,这样做列数会有负数,所以使用map来维护每一列的和。给一棵二叉树,每个结点都有一个水平位置:左子结点在它左边1个单位,右子结点在右边1个单位。从左向右输出每个水平位置的所有结点的权值之和。如图6-7所示,从左到右的3个位置的权和分别为7,11,3。按照递归(先序)方式输入,用-1表示空树。
2024-04-11 16:23:11
323
原创 UVA839 Not so Mobile 天平 解题报告
采用递归(先序)方式输入:每个天平的格式为Wl,Dl,Wr,Dr,当Wl或Wr为0时,表示该“砝码”实际是一个子天平,接下来会描述这个子天平。当Wl=Wr=0时,会先描述左子天平,然后是右子天平。输入一个树状天平,根据力矩相等原则判断是否平衡。如图6-5所示,所谓力矩相等,就是WlDl=WrDr,其中Wl和Wr分别为左右两边砝码的重量,D为距离。判断结果的布尔值通过函数返回值返回,力矩值通过引用变量传出。这道题输入就采用了先序递归的方式,所以在实现的时候也可以采取先序递归的方式接收输入。
2024-04-11 09:21:18
483
原创 UVA210 并行程序模拟 解题报告
当一个程序的配额用完之后,把当前语句(如果存在)执行完之后该程序会被插入一个等待队列中,然后处理器从队首取出一个程序继续执行。当一个程序成功执行完lock指令之后,其他程序一旦试图执行lock指令,就会马上被放到一个所谓的阻止队列的尾部(没有用完的配额就浪费了)。当unlock执行完毕后,阻止队列的第一个程序进入等待队列的首部。等待队列用双端队列deque维护,阻止队列用普通的队列queue维护,cur[i]代表当前第i个子程序执行到第几行,val[]维护变量值,细节见注释和代码。
2024-04-10 15:25:32
396
原创 UVA230 Borrowers 图书管理系统 解题报告
首先输入若干图书的标题和作者(标题各不相同,以END结束),然后是若干指令:BORROW指令表示借书,RETURN指令表示还书,SHELVE指令表示把所有已归还但还未上架的图书排序后依次插入书架并输出图书标题和插入位置(可能是第一本书或者某本书的后面)。用map< string, int >维护书名与书的状态之间的映射,1为在书架,2为借出,3为归还但不在书架,剩下的就全都是按照题意硬模拟,用最纯粹的,最朴素的,最丁真(bushi)的循环遍历是足够AC的,也就懒得想优化了,细节很多,具体参考代码和注释。
2024-04-09 20:10:58
227
原创 UVA1596 Bug Hunt 找Bug 解题报告
因为存在嵌套,所以解析一个数组变量的值要用递归或者栈,用map维护数组名到数组信息结构体的映射,数组信息结构体应该包括数组的大小,以及该数组各个下标的值(用map< int, int >来记录)。数组定义,格式为arr[size]。例如a[10]或者b[5],可用下标分别是0~9和0~4。定义之后所有元素均为未初始化状态。赋值语句,格式为arr[index]=value。例如a[0]=3或者a[a[0]]=a[1]。程序不超过1000行,每行不超过80个字符且所有常数均为小于2^31的非负整数。
2024-04-09 19:59:32
643
原创 UVA1595 Symmetry 对称轴 解题报告
使用map< double, vector< double > > 将所有的点按照y轴分类存放,按y值一行行遍历所有的点,如果真的存在一个对称轴使得所有的点左右对称的话,那么这个对称轴的x坐标一定是任意一行相距最远的两个点的中间值(即他们的和除以2),这里我们就取第一行的最远两点求出中间值,然后遍历每一行的时候都从最靠外的两个点开始从外到内配对算他们的中间值,如果全部都等于同一个中间值,则确实存在这么一条竖线使得所有点左右对称。给出平面上N(N≤1000)个点,问是否可以找到一条竖线,使得所有点左右对称。
2024-04-09 19:27:05
259
原创 UVA12100 打印队列 解题报告
维护两个队列,一个普通的queue队列q,用于维护当前的打印机打印队列先后顺序,一个优先队列pq,用于维护当前的打印优先级。每次从q中出队一个文件,然后将其和pq的队首进行比对(也就是当前优先级最高的那个),优先级相同则代表现在要打印的就是这个(题目保证了每个文件的优先级唯一)。详细细节可见代码和注释。所有任务都需要1分钟打印。打印机的运作方式如下:首先从打印队列里取出一个任务J,如果队列里有比J更急的任务,则直接把J放到打印队列尾部,否则打印任务J(此时不会把它放回打印队列)。
2024-04-09 17:25:15
307
原创 UVA10391 Compound Words 复合词 解题报告
因为涉及查找效率,所以我们使用set对字符串进行存储,然后我们遍历set中的所有字符串,对于每个字符串s,我们枚举分割位置j,使用substr()方法将字符串s分割为左右两个子串,判断左右两个子串是不是都在set中即可。给出一个词典,找出所有的复合词,即恰好有两个单词连接而成的单词。输入每行都是一个由小写字母组成的单词。输入已按照字典序从小到大排序,且不超过120000个单词。输出所有复合词,按照字典序从小到大排列。
2024-04-09 17:01:20
561
原创 UVA10763 Foreign Exchange 交换学生 解题报告
有n(1≤n≤500000)个学生想交换到其他学校学习。为了简单起见,规定每个想从A学校换到B学校的学生必须找一个想从B换到A的“搭档”。如果每个人都能找到搭档(一个人不能当多个人的搭档),学校就会同意他们交换。每个学生用两个整数A、B表示,你的任务是判断交换是否可以进行。非常基础的map计数,map< pair< int, int >, int > 统计学校A到学校B交换的人数,然后统计所有B到A交换的人数是否和A到B的一样即可,详细见代码。
2024-04-09 16:42:23
251
原创 UVA10935 Throwing cards away I 卡片游戏 解题报告
桌上有n(n≤50)张牌,从第一张牌(即位于顶面的牌)开始,从上往下依次编号为1~n。当至少还剩下两张牌时进行以下操作:把第一张牌扔掉,然后把新的第一张牌放到整叠牌的最后。输入每行包含一个n,输出每次扔掉的牌以及最后剩下的牌。题目怎么说你就怎么做,非常直球,很显然是维护一个队列。
2024-04-09 16:31:50
397
原创 UVA1594 Ducci Sequence 解题报告
对于一个n元组(a1, a2, …重复这个过程,得到的序列称为Ducci序列,例如:(8, 11, 2, 7) -> (3, 9, 5, 1) -> (6, 4, 4, 2) -> (2, 0, 2, 4) -> (2, 2, 2, 2) -> (0, 0, 0, 0).也有的Ducci序列最终会循环。至于判断每次的序列是否为全0,用朴素的O(n)的循环遍历来判断肯定会超时,我们可以选择在模拟序列过程之前,先预设一个n个0的vector,然后每次就可以直接用==比较运算符来判断当前序列是否变成全0序列了。
2024-04-09 16:18:18
265
原创 UVA1593 Alignment of Code 代码对齐 解题报告
循环输入,每次输入用getline接收一整行,然后使用stringstream来分割单词,用vector< string > rowStrs[maxn]存储每一行的单词,因为需要对齐每一列的左边界并且要尽量靠左,所以在记录单词的同时我们要同时更新每一列单词的最大长度,在记录了所有的单词之后,按行依次输出所有的单词,每个单词的输出宽度设置为当前列最大单词长度+1即可做到题目要求的“对齐每一列的左边界,并且尽量靠左”。单词之间至少要空一格。每个单词不超过80个字符,每行不超过180个字符,一共最多1000行。
2024-04-09 15:04:29
416
原创 UVA221 Urban Elevations 城市正视图 解题报告
该算法“删除”相邻的重复元素,然后重新排列输入范围内的元素(其实并没有真正的删除元素,,并且返回一个迭代器(容器的长度没变,只是元素顺序改变了),表示无重复的值范围的结束(指向超出无重复的元素范围末端的下一个位置)。输入每个建筑物左下角坐标(即x、y坐标的最小值)、宽度(即x方向的长度)、深度(即y方向的长度)和高度(以上数据均为实数),输出正视图中能看到的所有建筑物,按照左下角x坐标从小到大进行排序。输入保证不同的x坐标不会很接近(即任意两个x坐标要么完全相同,要么差别足够大,不会引起精度问题)。
2024-04-09 14:42:24
369
原创 UVA814 邮件传输的代理交互 解题报告
(这里的用户列表set < string >是用来记录对应收件人是否存在的,在后续模拟连接到每个MTA后,要给这个MTA的哪些用户发送DATA,还是需要用到map>的)。对于每个请求,首先读入发件人,分离出MTA和用户名,然后读入所有收件人,根据MTA出现的顺序进行保存到vector中,并且去掉重复(跳过不放入列表即可)。接下来读入邮件正文,最后按顺序依次连接每个MTA,检查并输出每个收件人是否存在,如果至少有一个存在,则输出邮件正文。
2024-04-09 14:23:11
760
原创 UVA1592 DataBase 解题报告
直接写一个四重循环枚举r1,r2,c1,c2可以吗?理论上可以,实际上却行不通。每次碰到一个新的行r,把c1,c2两列的内容作为一个二元组存到一个map中。更值得推荐的方法是在主循环之前先做一个预处理——给所有字符串分配一个编号,则整个数据库中每个单元格都变成了整数,上述二元组就变成了两个整数。输入一个n行m列的数据库(1≤n≤10000,1≤i≤10),是否存在两个不同行r1,r2和两个不同列c1,c2,使得这两行和这两列相同(即(r1,c1)和(r2,c1)相同,(r1,c2)和(r2,c2)相同)。
2024-04-08 19:57:53
268
原创 UVA540 Team Queue 解题报告
每个团队可以建模为一个队列,而团队整体又形成一个队列。queue teamQue为团队的队列,记录团队整体的先后顺序,存放的是每个团队的编号,queue q[]存放的是各自团队成员的队列,q[i]代表的是团队i的成员队列。有t个团队的人正在排一个长队。每次新来一个人时,如果他有队友在排队,那么这个新人会插队到最后一个队友的身后。如果没有任何一个队友排队,则他会排到长队的队尾。输入每个团队中所有队员的编号,要求支持如下3种指令(前两种指令可以穿插进行)。对于每个DEQUEUE指令,输出出队的人的编号。
2024-04-08 19:31:23
360
原创 UVA12096 The Set Stack Computer 解题报告
为了方便起见,我们将每个不同的集合分配一个唯一的整数ID,则每个集合都可以表示成所包含元素的ID集合。剩下的就是根据题意模拟即可,集合的并集交集需要用到set的set_union()方法和set_intersection()方法。有一个专门为了集合运算而设计的“集合栈”计算机。该机器有一个初始为空的栈,并且支持以下操作。ADD:出栈两个集合,然后把先出栈的集合加入到后出栈的集合中,把结果入栈。INTERSECT:出栈两个集合,然后把二者的交集入栈。UNION:出栈两个集合,然后把二者的并集入栈。
2024-04-08 19:17:48
276
原创 UVA156 反片语 解题报告
在判断是否满足条件时,字母不分大小写”,也就是在忽略大小写的情况下每个单词的字母构成一样则算重复,要找出所有不重复的单词。所以我们在用map进行计数的时候,要先将单词“标准化”,将其都转换为小写字母,可以适用C++内置的函数tolower(),然后再将其按照字典序从小到大sort一遍,再放入map。把所有单词统计完之后,检查所有的单词,检查每个单词的“标准化”是否在map中只统计了一次,是的话就放入答案列表。输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另外一个单词。
2024-04-08 16:27:38
362
原创 UVA101 木块问题 解题报告
从左到右有n个木块,编号为0~n-1,要求模拟以下4种操作(下面的a和b都是木块编号)。pile a onto b:把b上方的木块全部归位,然后把a及上面的木块整体摞在b上面。move a over b:把a上方的木块全部归位,然后把a放在b所在木块堆的顶部。move a onto b:把a和b上方的木块全部归位,然后把a摞在b上面。pile a over b:把a及上面的木块整体摞在b所在木块堆的顶部。遇到quit时终止一组数据。a和b在同一堆的指令是非法指令,应当忽略。
2024-04-08 16:03:15
187
原创 UVA1151 Buy Or Build 解题报告
https://vjudge.net/problem/UVA-1151平面上有n个点(1≤n≤1000),你的任务是让所有n个点连通。为此,你可以新建一些边,费用等于两个端点的欧几里德距离。另外还有q(0≤q≤8)个“套餐”可以购买,如果你购买了第i个套餐,该套餐中的所有结点将变得相互连通。第i个套餐的花费为Ci。最容易想到的朴素办法是先枚举购买哪些套餐,把套餐中的边权值都设为0,然后再求最小生成树。枚举量为O(2q),给边排序的时间复杂度为O(n2logn),Kruskal算法过程是O(n2),因此总复杂
2024-04-08 15:44:19
256
原创 UVA1395 Slim Span 解题报告
将边按照权值从小到大排序之后,如果一个连续边集[l, r]中的边可以使得n个点全部联通,则一定存在一个苗条度不大于e[r].w - e[l].w的生成树,枚举l和r。给出一个n(n≤100)结点的图,求苗条度(最大边减最小边的值)尽量小的生成树。
2024-04-08 11:00:12
274
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人