- 博客(33)
- 收藏
- 关注
原创 剖析最长公共子序列(LCS)
比如在序列A:32145 序列B:12345中,将A转化为一个有序序列12345,那么序列B就变成了32145那么序列A与序列B的最长公共子序列就是一个递增的序列,因为该序列是A的序列,那么就一定是有序而且递增的。所以在B中我们需要找一个上升的子序列,并且是最长的。那么LCS问题就成功转化为了LIS问题。最长上升子序列是求在两个序列中,寻找两者都有并且可以不连续的最长的子序列。
2024-07-19 20:38:48 120
原创 洛谷P2285打鼹鼠
机器人的移动是指从当前所处的网格移向相邻的网格,即从坐标为 (i,j) 的网格移向 (i−1,j),(i+1,j),(i,j−1),(i,j+1) 四个网格,机器人不能走出整个 n×n 的网格。所以就可以按顺序遍历所有的仓鼠,让所遍历到的仓鼠作为最后一个,第二层循环遍历前面的仓鼠,判断打完它是否到达最后一个仓鼠的位置。),其中 m 表示在这一段时间内出现的鼹鼠的个数,接下来的 𝑚m 行中每行有三个数据 time,x,y 表示在游戏开始后 time 个时刻,在第 x 行第 y 个网格里出现了一只鼹鼠。
2024-04-27 08:33:19 345
原创 洛谷P1182数列分段
所谓二分答案,就是“二分”和“答案”两部分,答案是对象,二分是手段,采用二分的手法对答案进行高级枚举。我们最终输出的答案是最大值的最小,所以二分答案是对这些值的二分,左限定为0,右限定为输入所有数的和+1,传给check函数就是每次二分后的结果,即(l+r)/2,在check函数中我们定义为x。3.整体思路就是,用now指针从零开始遍历数组,用sum记录每一段的总和,保证不超过m,一旦超过,break跳出循环,继续下次遍历,每次对分段时cnt++,在整个过程中,一旦cnt>m,reruen false;
2024-03-15 18:35:54 848
原创 洛谷P3853路标设置
然后二分答案,将mid传入check函数中,将mid作为最小空旷指数值,将所有长度大于mid的数减去mid,并且cnt++,直到dif数组中的数都遍历了一遍,然后判断cnt与k的关系,小于等于返回true否则返回false。请注意,公路的起点和终点保证已设有路标,公路的长度为整数,并且原有路标和新设路标都必须距起点整数个单位距离。第 11 行包括三个数 L,N,K,分别表示公路的长度,原有路标的数量,以及最多可增设的路标数量。50%50% 的数据中,2≤N≤100,0≤K≤100。
2024-03-10 18:37:28 457
原创 洛谷P2678跳石头
随后回到binary函数中,如果返回true,说明,mid的值所取到的移走石头的数量是符合m条件的所以让l等于mid,因为我们要找的时一个临界值,左边取到的值都符合m,右边都大于m。那么,这个值越小,需要移走的石头就越少(你品,你细品),也就是说反之,这个值增大,我们需要移走的石头就越多,因为这个值x是最终答案,所以场上不能有比x更小的距离出现,所以比x越小,移走的石头就越少,那么就越小于m(题目中给的允许移走石头的数量),所以在x取到某一点时,移走的石头刚好等于m,这时候x的取值就是我们要找的答案。
2024-03-10 14:14:40 1307
原创 洛谷P1873EKO / 砍树
Mirko 的伐木机工作流程如下:Mirko 设置一个高度参数 H(米),伐木机升起一个巨大的锯片到高度 H,并锯掉所有树比 H 高的部分(当然,树木不高于 H 米的部分保持不变)。例如,如果一排树的高度分别为 20,15,10 和 17,Mirko 把锯片升到 15 米的高度,切割后树木剩下的高度将是 15,15,10 和 15,而 Mirko 将从第 1 棵树得到 5 米,从第 4棵树得到 2 米,共得到 7 米木材。,那么就是把锯子的高度二分,然后计算能获得的树的长度之和,从而再次进行二分判断。
2024-03-09 18:38:24 426
原创 洛谷P2895Meteor Shower S
然后就是从(0,0)开始遍历,本来是想着省变量直接在star数组上面搜索,写了半天总有小错误,直接也不省变量了,又开一个二维数组g用来记录步数。根据预报,一共有 M 颗流星(1≤M≤50,000) 会坠落在农场上,其中第 i 颗流星会在时刻(0≤Ti≤1000)砸在坐标为 (Xi,Yi)(0≤Xi,Yi≤300)的格子里。贝茜在时刻 00 开始行动,她只能在第一象限中,平行于坐标轴行动,每 11 个时刻中,她能移动到相邻的(一般是 44 个)格子中的任意一个,当然目标格子要没有被烧焦才行。
2024-03-09 18:17:59 552
原创 洛谷P1101单词方阵
摆放可沿着 88 个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间可以交叉,因此有可能共用字母。并且需要保证按照yizhong字母顺序对照,也就是第i个字母必须与字符串yizhong的第i个字母相等。由于只输出符合题意的字符串,其余的都输出*,所以创建一个bool类型的ans数组,一旦符合,将七个位置的bool值赋值为true,方便后续输出。由于本题需要沿着八个方向中的其中一个直线或斜线搜索,所以我为dfs添加了一个参数dir,保证在接下来搜索中按照既定方向,于是创建了go数组。
2024-03-03 23:28:03 438
原创 洛谷P1019单词接龙
单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单词都最多在“龙”中出现两次),在两个单词相连时,其重合部分合为一部分,例如。输入的第一行为一个单独的整数 n 表示单词数,以下 n 行每行有一个单词,输入的最后一行为一个单个字符,表示“龙”开头的字母。遍历所有单词,判断它能接在那些单词后,用g数组标记,数值为重合的长度。,另外相邻的两部分不能存在包含关系,例如。只需输出以此字母开头的最长的“龙”的长度。
2024-03-02 16:40:37 324
原创 洛谷P1149火柴棒等式
给你 n 根火柴棍,你可以拼出多少个形如A+B=C 的等式?等式中的 A、B、C 是用火柴棍拼出的整数(若该数非零,则最高位不能是 0)。
2024-02-22 18:40:21 343
原创 洛谷P2036PERKET
前面两个样例一二都能过,于是我就分析样例三,我发现样例三答案输出1是因为选择了后面三种选项,而后面的三种选项无论是单个论酸苦度的差值还是两两选择讨论酸苦度的差值都不是最小的,但是当三个都选择的时候,差值才是最小的。当跑到第四个选项也就是最后一个选项的时候,会发现选择第四个选项并把第三个也选上就能使差值最小,但是flag此时已经为4了,搜索已经结束了。本来的思想就是给每个选项都跑一遍,如果他让我的差值减小了并且比我的ans要小,那么就让ans等于它(ans是最后输出的答案,与代码中的x一个含义)。
2024-02-22 15:02:34 372
原创 洛谷P1088火星人
从第一位数开始调用dfs,如果flag为0,证明刚开始进行搜索,让这一位数字等于火星人给出的同位数字,sta数组记录数字状态,使用过的数字记为true,继续向下搜索x+1位,如果下x>n说明已经将所有的数字操作完,如果符合条件输出,不符合return掉继续搜索,然后回溯一下。显而易见,只是一道全排列的题目,有了P1076的经验这道题应该不算难,dfs方法。这道题重点是起始的全排列被给了出来,需要往后遍历出比它大的。flag:用来记录比火星人给出数大的数的数量。mars数组:记录火星人给的数。
2024-02-20 11:17:38 379
原创 洛谷P2089烤鸡
由于本题是输出格式是先输出方案的总数(ans)再输出的方案内具体各个调料的质量,所以要把每个符合的num整合到ans2中。这道题正解是枚举,歪解是DFS。所以我用DFS解一下。ans2:用来记录所有符合题意的每个方案的各个调料的质量。sum:实际的美味程度,也就是各调料质量之和。废话不多说,直接上代码讲解。num:用来记录当前的各个调料质量。flag:当前操作的调料的编号。n:就是目标美味程度。
2024-02-19 19:53:17 414 1
原创 bitset位图
返回它转换为unsigned long long的结果,如果超出范围则报错。返回它转换为unsigned long的结果,如果超出范围则报错。返回它转换为string的结果。将第p + 1位变成1。将第p + 1位变成x。将第p + 1位变成0。将第p + 1位取反。
2023-08-17 10:21:42 116 1
原创 关于菱形继承那些事
虚基类指针指向的是虚基类表格,此时Luo类只有一个age属性,虚基类表格存储的是偏移量,Horse存储一个8,Lv储存一个4,加上偏移量之后最终都指向Animal的age,所以第一次将其修改为90,第二次修改为100,由于修改的是同一份数据,结果就显示两个相同的age属性。vbptr(虚基类指针):v:virtual b:baseb:base ptr:pointer。创造一个类,另外另外两个类将其作为父类继承,然后又出现一个类将这两个类作为父类继承,就叫菱形继承。
2023-08-13 11:09:56 129 1
原创 继承权限及同名成员处理
若有相同的代码,继承能够节省空间,构造函数与析构函数调用时机一句话总结白发人送黑发人。protecte: 子类的成员函数中可以直接访问。private: 子类的成员函数中不可以访问。在父类内的所有成员函数内, 可以直接访问name。protected和private非常相似。若同名访问父类成员需加上父类作品域。自己的成员函数内, 可以访问。和private的唯一区别是。可以通过对象来访问这个成员。
2023-08-12 11:18:18 97 1
原创 this指针使用指南
this指针隐含在每一个非静态成员函数内的一种指针。this指针指向被调用的成员函数所属的对象。2.在类的非静态成员函数中返回对象本身,可以使用return *this;1.当形参和成员变量同名时,可以使用this指针来区分。
2023-08-08 14:08:35 128
原创 深拷贝与浅拷贝
浅拷贝是编译器提供的拷贝构造函数,会将一个已经实例化的对象的所有属性逐字节的拷贝到另一个即将实例化的对象上面,如果前者的一个属性是指针,那么它存储的是一个地址,两者的其中一个属性存储的是一个地址,当使用结束释放的时候会重复释放堆区的同一块内存,发生错误。深拷贝就是在堆区重新开辟空间,再进行拷贝操作。下面是代码实现,使用new在堆区重新开辟空间储存height的地址。前者与后者的height属性的地址并不相同,但值相同。这里并没有自定义拷贝构造函数,使用的是编译器提供的浅拷贝,发生堆区内存重复释放的错误。
2023-08-07 10:37:52 57 1
原创 构造函数与析构函数c++
注意:不要使用拷贝构造函数初始化匿名对象,如:Person(p2),含义是用p2这个实例化的对象初始化一个匿名对象,对编译器来叔,这只是一个对象的定义声明,会报错重定义。:将一个已经实例化的对象的属性完全赋给另一个即将实例化的对象,传参需要用引用方法,为了不改变原对象,前面加const。1.每创建一个类的时候,系统自动生成三个函数,分别是默认构造函数,默认析构函数和拷贝构造函数,前两个不自定义的时候全是空实现。构造函数分为三种,默认构造,传参构造和拷贝构造。:需要传入一个或多个参数,将成员属性赋值。
2023-08-06 17:57:31 60
原创 浅谈为什么使用拷贝构造时需要用引用方式传递参数
构造函数是在你实例化一个对象时自动调用的函数,如果不写,系统会帮你写,不过是一个空实现,如果你写,那么每次实例化一个新的对象时都会自动调用你自定义的构造函数。所以使用引用的目的就是不另开辟一个新的空间而是给原对象起一个别名使用同一个储存空间,然后前面加上const防止被修改。值传递的本身要创造一个新的副本,而当创造副本时,又会自动调用构造函数,形成一个无限递归。拷贝构造是将一个已经实例化之后的对象的所有属性传给一个新的即将实例化的对象。
2023-08-06 16:01:52 227
原创 洛谷P2670扫雷游戏
两个细节,首先是cin之后用getchar()吞掉回车,防止干扰后面的while循环。其次就是输入和输出用for循环要从1开始,不然会涉及下标在数组外。话不多说,奉上AC代码。大致思路就是用while循环接收数据,用for循环控制次数,创建二维数组,如果是雷记为1,不是雷记为0,最后用for循环遍历出来即可。一道普普通通简简单单的模拟题,但是细节也挺多的。
2023-07-18 18:53:16 317 1
原创 浅谈c++递归算法之汉诺塔
如果n不为1,那么首先需要借助c将上面n-1个圆盘移动到B,然后将最后一个从A移动到C,最后把B的n-1个圆盘从B移动到C。然后就是将剩下的一个从A到C,由于只剩下了一个,所以就不用调用函数了,直接输出即可,printf("%c-->%c\n", a, c);如果汉诺塔只有一层,那我们只需要把盘子从A移动到B,所以所创建的函数需要有一个条件语句,设需要移动的盘子数为n,if(n==1)printf("%c-->%c\n", a, c);递归算法无非就是创建一个函数,在函数里面调用函数。
2023-07-17 09:51:51 260 2
原创 STL之substr、insert和erase函数
erase的意思是橡皮,所以这个函数发挥作用是将迭代器指定范围的元素删除。第一个形参是删除的开始迭代器,第二个是长度(可省略),省略表示第一个迭代器指的元素。这一串先找到的c的位置,然后删除。str.substr()就表示参数都是默认值,返回值是原字符串。重载只展示了其中一种,不过多介绍,(因为我也在学习QWQ)_count:表示提取字符串长度,默认到字符串末尾。所以substr函数的返回值就是提取出的字符串。_off:表示起始位置,默认为零。被删除的是2-6,输出为01789。这两个参数都不可省略。
2023-07-16 20:34:09 377 1
原创 STL之sscanf与sprintf函数
1.描述sscanf有着对字符串强大的解析功能,是一个必不可少的工具。它的返回值是解析字符串的的个数。格式如下2.格式介绍首个字符串是被解析的字符串,%d则是它的格式控制符,然后存储到num中,要注意的是要用&表示地址。这里的输出是123456,a不符合格式所以不解析。这个输出是abcd,一旦不符合sscanf会立即停止解析。
2023-07-16 12:00:19 230 2
原创 从零开始的c++学习
1.find()查找的是完全符合2.与find()一样,但是反向3.find_first_of()查找不必完全匹配4.find_last_of()与第三个一样,但是反向5.find_first_not_of()不完全匹配,查找的是与内容不同
2023-07-15 21:06:05 139
空空如也
软著申请中签章页有签名申请表上面却没有签名
2024-11-01
TA创建的收藏夹 TA关注的收藏夹
TA关注的人