- 博客(21)
- 收藏
- 关注
原创 C++ | 常用位运算技巧
如果x为2的幂次方,则x的二进制表示只有一个1,x - 1就有很多个连续的1并且和x的1没有交集,两者与运算一定为0。移位就是二进制移的,表示二进制的第 i 位,结果必然为0或1,结果几表示几。如果x = (010010),则lowbit(x) = (000010)公式:lowbit(x) = x & -x。结果为1说明是奇数,结果是0为偶数。lanqiao OJ 1331 二进制中1的个数。公式:x & (1 << i)公式:x & (x - 1)公式:x >> i & 1。因为1 & 1 = 1。
2024-04-13 00:19:53
585
1
原创 C++ | 双指针(难点对撞指针)
while循环中,我刚开始没有理解的是为什么i > j还要操作,是因为 i 是慢指针,i > j 表示的是不合法j 要++快慢指针是两个指针在同一个方向,同时向另一个方向进行的问题,难点在于需要根据题目中的条件进行两个指针的位置判断。对撞指针顾名思义就是,一个容器最前面和最后面各一个指针,两个指针相向进行,下面是一道例题。sum += a[ ++ j] 就等价于 j ++, sum += a[j];这样只是保证了区间的合法,下面判断值的合法就可以了。回文判定,是返回“Y”,否则返回“N”
2024-04-12 22:19:51
402
原创 C++ | lanqiao OJ 389 摆花(线性DP)
dp[i][j]表示的状态是第i种花第j个位置,要注意的是j和k都是从0开始遍历的。k从0开始是因为上一层k只要
2024-04-12 21:47:56
442
原创 C++ | 动态规划(线性DP)DP入门学习
题解:设状态dp[ i ][ j ] 表示从第i行第j列的元素往下走的所有路径当中最大的和,这代码当中 dp[ i ][ j ] 就是在维护最大的和 ,最后输出dp[1][1]。我最初没想明白为什么是dp[1][1],因为从下往上遍历,且每次取的都是最大值,到最上边就剩下一个dp[1][1],所以就是最大值了。状态转移方程为dp[ i ] = dp[ i - 1 ] + dp[ i - 2 ] ,若果i为破损的,则dp[ i ] = 0。是dp[i][j] 的取值,是状态与状态之间的转移关系,
2024-04-11 21:06:49
1476
1
原创 C++ | 用DFS和BFS实现联通块问题——可解最短路径
对于蓝色的小块而言,四联通块(题目不说一般都是四联通)就是周围红色的区域,是可到达的位置,八联通块是加上黄色的位置。
2024-03-29 19:59:36
644
2
原创 C++ | 由递归入门DFS搜索
输入5等不等于1,不等于进入下一个dfs状态是4,依次递归出来就是5,4,3,2,1;输入5接着进入下一个dfs状态,发现4还不是1,状态就接着保持,然后进入下一个状态,直到进入发现为1时,开始返回上一层状态,依次往上。下图就是一个完整的搜索的递归与回溯的过程。
2024-03-27 21:40:57
375
原创 C++ | 剪枝(DFS)lanqiao 数字王国之军训排队
正常用DFS写,会遍历每一种情况,因此要判断他的合法性,并且在第十个检测点会超时,用剪枝后,这道题就可以过啦。以下是经过剪枝的算法。
2024-03-25 11:28:05
348
原创 C++ | DFS搜索(回溯法)学习分享
题解:将皇后对应的米字型区域设置成“禁区”,后面的皇后就不能放在“禁区”内,回溯时将禁区取消掉。需要用int数组来表示“一个位置被多少个皇后占了”,当占数为0的时候表示“禁区解除”。在后续搜索中,每次开始时更新最小时间戳(否则会认为7、4之间有环),如果走到已经走到过的点就必须停下。跑dfs求最大的环,用时间戳(dfn),将走过的地方标记一个时间戳(即第几步走到的)。坐标拆成两个一维数组的思想,其实就是表示一个点的上下左右。
2024-03-25 10:45:12
1479
原创 C ++ | 蓝桥题库—异或森林(双指针)
我遇到的问题是完全平方数sq的取值应该是j * j,列举的是前200个完全平方数,因为非平方数明显比平方数要多,采用正难则反的原则。如果是与平方数异或为0的那么证明是枚举到这个平方数了,拿总数减去这个当前平方数。
2024-03-19 12:49:17
514
3
原创 C++ | 蓝桥题库区间或(位运算)
(1 << w)1左移w位相当于2的w次方,prefix[w][r] - prefix[w][l - 1]相当于[l, r]这段距离上有1就让ans加上1,没有就不加。,将答案分成32份(1e9最多32位二进制数)这样才有的prefix[32][N]前缀和数组,求的是第i位数第w位上的和。
2024-03-14 21:55:11
310
原创 C++ | 二分查找(重点二分答案)
常见的二分类型:1. 整数二分2. 小数二分(相对较少)3. 二分答案(最常见)最直接的就是用O(logn)的时间,枚举时间较慢O(n)。小数二分与整数二分的思想相一致,就不在赘述了。
2024-03-11 22:01:10
1826
1
原创 c++ | 进制转换
1. 以字符串输入。2. 用一个数组a[N]存储相对应的十进制数。3. 最后用long long x = x * k(转换前的进制)+ a[i]以下题目:将十六进制2021ABCD转换为十进制数。
2024-03-08 21:34:37
405
1
原创 c++ | break和continue的区别及用法
也就是第i次的不执行,接着执行第i+1次,并且在一定条件下可以代替else使用,比如以下两段代码表示的意思就是一样的。,也就是从第i次开始后边的(第i+1、i+2、i+3......)都不执行了。
2024-03-07 20:48:23
252
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人