自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(24)
  • 收藏
  • 关注

原创 BFS迷宫游戏(c++)

用 DFS 求解迷宫最短路有一个很大的缺点,需要枚举所有可能的路径,读入的地图一旦很大,可能的搜索方案数量会非常多,用 DFS 搜索显然效率会很低。由于 BFS 是分层搜索,因此,第一次搜索到终点的时候,当前搜索的层数就是最短路径的长度。搜索过程中第一次搜索到终点的时候是最短距离,所以可以让。等于 −1,表示这个点是第一次搜索到的点,需要更新。数组初始化为 −1,搜索过程中如果刚搜索到的点的。如果我们要求解起点到某个点的最短距离时,可以设置。记录起点到达每个点的最短距离。

2024-05-20 18:37:45 367

原创 8皇后问题(c++)

因为我们是逐列放置的,所以列内是不会冲突的,对于行也很好处理,如果某行被占用了,只需要用一个数组标记即可。N 皇后问题是一个经典的问题,在一个 N×N 的棋盘上放置 N 个皇后,每行刚好放置一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。从第 0 列开始,我们依次给每一列放置一个皇后,对于一个确定的列,我们只需要去枚举放置的行即可,在保证放置合法的情况下,一直搜索下去。上图就是一个合法的 8 皇后的解。而这样的对角线上的位置的坐标的行减去列的值也是相同的,都是 −2。

2024-05-19 19:52:33 704

原创 连通块(c++)

进行深度优先搜索的次数就是图中的连通块个数,如果我们在每次进行深度优先搜索时,对访问过的点进行不同的标记,就可以记录每个连通块内的顶点有哪些了,也可以跟迷宫问题时一样求解连通块大小,最大连通块等问题。其实之前在迷宫问题的时候,我们谈过连通块,这两个概念其实是一样的,正如本章最开始所说,我们可以把迷宫画成一般的图的样子,而且画出来就是无向图。在无向图上,我们可以利用 DFS 可以求连通块的数量。形象一点说,一个连通块就是一些能互相到达的点形成的图上的一块。在迷宫上的连通块也就是在这个图上的连通块。

2024-05-16 18:11:19 575 1

原创 迷宫游戏(c++)

2.否则我们就需要从该格子出发,可以分别枚举向左、向下、向右、向上四个方向,依次去判断它旁边的四个点是否可以作为下一步合法的目标点,如果可以,那么我们就进行这一步,走到目标点,然后继续进行操作。很明显,当我们从任意格子出发,都有可能往四个方向走:上,下,左,右。而初始的时候,我们是在起点S处,之后开始进行我们的搜索过程,也就是我们要讲的 DFS 算法。3.当然有可能左、下、右、上四个点都无法再成为合法的目标点了,那么我们就回退一步,然后从上一步所在的那个格子向其他 未尝试的方向 继续枚举。

2024-05-15 19:15:35 748

原创 等和的分隔子集

晓萌希望将1到 N 的连续整数组成的集合划分成两个子集合,且保证每个集合的数字和是相等。例如,对于 N =3,对应的集合{1,2,3} 能被划分成{3} 和{1,2} 两个子集合。输出包括一行,仅一个整数,晓萌可以划分对应 N 的集合的方案的个数。当没法划分时,输出 0。对于 N =3,我们只有一种划分方法,而对于 N =7时,我们将有 4种划分的方案,输入包括一行,仅一个整数,表示 N 的值(1 ≤ N < 39)。这两个子集合中元素分别的和是相等的。

2024-05-13 18:32:28 322 1

原创 可行性判定(c++)

已知第 i 件物品的体积是 ci​,每种物品有且仅有一件,每一件物品能够选择放或者不放入背包。普通的 01 背包中要求放入物品的体积之和不超过 V,而现在我们需要使体积之和恰好为 V。现在我们不考虑物品的价值,只关心是否能够取出若干个物品,恰好使这个背包被装满。因为结果只需要输出 V 这个体积是否能被组出,因此我们可以将 dp 数组定义成。也就是说,现在我们需要选出若干件物品,使它们的体积之和。时间复杂度为 O(NV),空间复杂度为 O(NV)。当前有 N 件物品和一个容积为 V 的背包。

2024-05-11 19:58:13 544 1

原创 完全背包问题(c++)

虽然物品个数是无限的,但是实际上,由于背包容量有上限,每个物品最多选取的个数也是有限制的,这样可以转换成多重背包问题,进而可以转换成 01 背包问题。现有容量为 V 的背包,请你放入若干物品,使总体积不超过 V,并且总价值尽可能大。当前有 N 种物品,第 i 种物品的体积是 ci​,价值是 wi​。每种物品的数量都是无限的,可以选择任意数量放入背包。可以用多重背包的思想来解决完全背包。

2024-05-09 20:11:20 577 1

原创 多重背包(c++)

这一份代码和 01 背包相比,不再有 else 部分了,因为,k = 0 的时候 dp[i][j] = max(dp[i - 1][j], dp[i][j]) ,相当于 01 背包的 else 部分。我们也可以在转移的过程中枚举 k,代表第 i 个物品选取的数量,和 01 背包的思想一样,有如下转移。我们可以把每个种类的 ni​ 个物品,都当成 01 背包里的不同种物品,只是恰巧体积和价值相同。与 01 背包不同的是,多重背包每种物品都有若干个,数量为 ni​,是有限的。

2024-05-08 18:23:30 521 1

原创 01 背包问题(c++)

对于每个物品是否要装入背包,我们自然可以进行暴力枚举或搜索,但是如果要暴力地去做,那么时间复杂度会非常的高,这时候需要一种更优的算法——动态规划。为了使价值最大化,如果第 i 个物品放入背包后,总体积不超过限制且总价值比之前要大,那么就将第 i 个物品放入背包。当 ci​≤j≤V 时, dp[i][j]=max(dp[i−1][j],dp[i−1][j−ci​]+wi​)前 i 个物品,放在背包里,体积之和不超过 j 的前提下,所获得的最大价值为 dp[i][j]。对于 01 背包,先确定这个问题的状态。

2024-05-07 21:59:07 424

原创 最长公共子序列(c++)

有了前面的基础,可以发现这个问题仍然可以按照序列的长度来划分状态,也就是 S1​ 的前 i 个字符和 S2​ 的前 j 个字符的最长公共子序列长度,记为 dp[i][j]。如果 S1​ 的第 i 项,和 S2​ 的第 j 项相同,那么 S1​[i] 与 S2​[j] 作为公共子序列的末尾,则。举一个例子,两个序列 S1​=abcfbc 和 S2​=abfcab,根据转移方程可以得出 dp[i][j]最长公共子序列:给定两个序列 S1​ 和 S2​,求二者公共子序列 S3​ 的最长的长度。

2024-05-04 13:29:47 507 1

原创 [NOIP 2008] 传球游戏(c++)

比如有 33 个同学 11 号、22 号、33 号,并假设小蛮为 11 号,球传了 33 次回到小蛮手里的方式有 1→2→3→11→2→3→1 和 1→3→2→11→3→2→1,共 22 种。游戏规则是这样的:n 个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球,每个同学可以把球传给自己左右的两个同学中的一个(左右任意),当老师再次吹哨子时,传球停止,此时,拿着球没传出去的那个同学就是败者,要给大家表演一个节目。100%100% 的数据满足:3≤n≤30,1≤m≤30。

2024-05-03 15:04:34 421

原创 最长上升子序列(c++)

最长上升子序列,就是给定序列的一个最长的、数值从低到高排列的子序列,最长上升子序列不一定是唯一的。先来确定状态,可以设 dp[i] 表示只考虑了前 i 个数的时候的最优解,考虑到达这个状态的最后决策,应该是把 a[i] 接到前边的一个子序列之后,那接下来就考虑怎么接。此时,我们在把 a[i] 接进前边的子序列的时候,就看 i 前边的每一位 j ,如果有 j

2024-05-03 14:52:51 316

原创 归并排序 -- 稳定(c++)

方法很简单,用两个变量p1和p2分别表示两个数组未被取出的元素中最小元素的下标,初始为 0。然后每次取出a[p1]和b[p2]中较小的那个放进新的数组里。如果取出的是a[p1],那p1就自增 1;否则,把区间划分为 [l,mid] 和 [mid+1,r] 两部分递归处理,其mid=⌊2l+r​⌋。归并排序的基本思想是分治,每次把待排序的区间分成两半,递归地处理。先来看这样一个问题,现在你有两个有序数组a和b,如何把他们合并为一个新的有序数组c?如果有数组被取空了,那就把另一个数组剩下的都放进来就可以了。

2024-05-02 14:52:19 6 1

原创 冒泡排序 -- 稳定(c++)

冒泡排序的基本思想为:假如待排序数组的长度为 n,从前往后两两比较相邻元素的关键字,若 ai−1​>ai​,则交换它们,直到数组比较完成。每趟交换以后最后一个元素一定是最大的,不再参与下一趟交换。也就是对于第 i 趟交换,只需要比较到 an−i​ 即可。直到一趟比较内没有进行交换,算法结束。时间复杂度也为O(n2)。冒泡排序是一种稳定的排序算法。

2024-05-02 10:46:58 3 1

原创 选择排序--不稳定(c++)

选择排序的思想是,将数组分为已排序的前半部分和待排序的后半部分,每趟从待排序区域选取最小的元素,将其放到已排序区域的最后。因为每趟可以让待排序区域的元素数量减少一个,所以总共需要 n−1 趟操作就可以将整个数组排序完成。很显然,选择排序的时间复杂度也是 O(n2)。为最后的交换操作可能会破坏原来值相同的元素顺序,因此选择排序是不稳定的排序算法。

2024-05-01 20:25:06 211

原创 插入排序--稳定(c++)

插入排序是一种非常直观的排序算法,它的基本思想是将数组分为已排序的前半部分和待排序的后半部分,每次把待排序部分的第一个元素,插入到已排序部分的对应位置中,直到全部记录都插入到已排序部分中。上述代码中,内层循环是从大到小找第一个 aj​≥ai​ 的位置 j,然后把 ai​ 放在 j+1 这个位置。我们边寻找,边调整元素的位置,相当于提前了元素后移的操作。因此一次插入的时间复杂度为 O(n),一共执行 n−1 次,总时间复杂度为 O(n2)。显然,插入排序是一种稳定的排序方法。

2024-05-01 20:20:42 261

原创 最大子段和

给定一个由数字组成的序列,其中连续的一段子序列称为一个 子段,子段中的所有数之和称为 子段和,这里只考虑非空子段,即至少包含一个元素的子段。这节课我们来学习如何求得一个序列中子段和最大的子段的子段和,即求 最大子段和。

2024-04-29 18:26:30 288

原创 洛谷 — 欢乐的跳

一个 �n 个元素的整数数组,如果数组两个连续元素之间差的绝对值包括了 [1,�−1][1,n−1] 之间的所有整数,则称之符合“欢乐的跳”,如数组 {1,4,2,3}{1,4,2,3} 符合“欢乐的跳”,因为差的绝对值分别为:3,2,13,2,1。每组测试数据第一行以一个整数 �(1≤�≤1000)n(1≤n≤1000) 开始,接下来 �n 个空格隔开的在 [−108,108][−108,108] 之间的整数。对于每组测试数据,输出一行若该数组符合“欢乐的跳”则输出。

2024-04-29 18:17:44 255

原创 洛谷 — 直播获奖

更具体地,若当前已评出了 �p 个选手的成绩,则当前计划获奖人数为 max⁡(1,⌊�∗�%⌋)max(1,⌊p∗w%⌋),其中 �w 是获奖百分比,⌊�⌋⌊x⌋ 表示对 �x 向下取整,max⁡(�,�)max(x,y) 表示 �x 和 �y 中较大的数。如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实际获奖人数可能比计划中多。本次竞赛的获奖率为 �%w%,即当前排名前 �%w% 的选手的最低成绩就是即时的分数线。只有一行,包含 �n 个非负整数,依次代表选手成绩逐一评出后,即时的获奖分数线。

2024-04-28 18:51:18 207 1

原创 洛谷 -- 车厢重组

在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转 180180 度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。第一行是车厢总数 �(≤10000)N(≤10000)。第二行是 �N 个不同的数表示初始的车厢顺序。

2024-04-28 18:25:49 272 1

原创 高精度除法

输入两个整数 �,�a,b,输出它们的商。两行,第一行是被除数,第二行是除数。一行,商的整数部分。

2024-04-27 09:53:05 379

原创 B3713 [语言月赛202302] 对了,还有花,少女,银河

在全真模拟赛里,需要选手在本地完成代码后按照真实比赛的要求放入以题目名命名的子目录(子文件夹)中,子文件夹的上级文件必须是用考号命名的文件夹。给出每道题的名字和每个选手每份源程序的目录结构,请你对于每个选手的每份源程序,判定 ta 的源程序目录是否正确。但是,扶苏生气地发现,即使在前一天晚上已经在群里强调了多次如何打包,并且通过测试赛指出了提交文件目录有问题的选手,但在全真模拟赛时仍有大量同学的目录结构出现问题。按输入顺序,对每个选手的每个目录结构,输出一行一个字符串,如果该选手的目录结构正确,输出。

2024-04-27 09:44:13 260

原创 三人行必有我师

第一行有两个整数 n,た(1 < k <n < 105),表示人的总数和要选的连续的人数,两数之间以一个空格分隔第二行有 n 个空格隔开的整数 t(1 < t;< 10°),为每个人的知识值。子曰:“三人行,必有我师”。人越多,可请教的也越多。假设有几个人排成一列,每个人的知识值是一个整数,现在我们想要选取 k个连续的人,使得这 k个人的知识值之和最大,请你输出这个最大值。输入部分已经写好,所有代码均未锁定,可以根据需要自行更改。输出为一个整数,为连续 k个人的知识值之和的最大值。

2024-04-22 18:30:23 490

原创 高精度乘法

给出两个非负整数,求它们的乘积。输入共两行,每行一个非负整数。输出一个非负整数表示乘积。

2024-04-22 18:26:44 369

空空如也

空空如也

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

TA关注的人

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