- 博客(134)
- 收藏
- 关注
原创 Codeforces Round 965 (Div. 2)
有 A , B 两人,A可以走主桥和备用桥 , B只能走备用桥,给定 n 个岛屿和 m 条备用桥,到达第n个岛屿获胜,当一个人离开岛屿后,这座岛屿和连接的所有桥都将倒塌,若 B 可以从 i ( 1
2024-08-11 20:18:40
694
原创 Codeforces Round 964 (Div. 4)
1. 若要将所有数字变为0,则只能操作[ y/3] ,则要多进行操作[ y/3 ] ,另一个数字要进行 x * 3 , 则x = 0。3. 若1的个数为 i ,则0的个数为 k - i ,有乘法原理得C( i , cnt1 ) * C( k - i, cnt0 )2. 什么数字最容易变为0 , 最小的数字,先让最小的数字变为0,然后让其他的数字变为0。3. 每个数字变为0的操作次数是不变的,则可以用前缀和。题意:给定一个两位数,求位数之和。思路:贪心 + 模拟。
2024-08-08 10:49:50
305
原创 河南萌新联赛2024第(三)场:河南大学
令 c > b > a , sum = n * b( 平均数 * n ),若 sum >= w 则说明当前的总和过大 ,应减小,将其中。的一个 b 变为 a ,总和则是 sum + a - b,若总和过小,应增大,将其中的一个 b 变为 c ,总和为。状态表示:f[i][j][k] 从(1,1)到达(i,j)其中使用k次魔法的最大生命值。1. 处理一个前缀和 f[i] 表示从 0 到 i ,累加1的操作次数。当 n > 0 时 f(n) = n * n - n + 2。当前这个(i,j)点不使用魔法。
2024-07-31 22:16:00
259
原创 动态规划——背包模型
题目含义:一共有n种商品(每种商品只有一个),背包体积为v,并且已知每种商品的体积和价值,求将商品放入背包的最大价值状态表示:f[i][j] 为前i个物品放入背包,且总体积不超过j的最大价值状态转移方程:f[i] = max( f[i-1][j] , f[i-1][j-v[i]] )(根据物品选 或 不选 分类)
2024-07-30 12:25:19
801
原创 Codeforces Round 962 (Div. 3)
1. 如何确定一段区间内 0 1 个数相等 -> 将 0 当做 -1 ,1 当做 1处理,若0 1个数相等,则说明这一段区间和为0 f[r] == f[l-1]2. 一段区间中,a中字符串中的字符数 - b中字符串中的字符数 -> 替换的次数。通过枚举 a b , 确定 c 的个数 , 从而确定(a,b,c)的个数。1中字符串 'a' 和 'c' 的个数多于 2中的字符串 答案为2。2. 如何确定(l , r)对(x,y)的贡献 -> 扩展(x,y), (x,y) 那么x的范围 * y的范围。
2024-07-29 11:37:09
280
原创 Codeforces Round 961 (Div. 2)(AB1B2C)
一段数组中,选取子序列,要求子序列中,任意两个元素之差小于等于1,并且子序列的和小于等于 m , 求子序列的最大和。1.首先容易分析出 -1 的情况 a[ i - 1] > 1&& a[ i ] == 1。假设 a 朵花的花瓣数为 a , 一共有 x 朵 ,b 朵花的花瓣数为 b , 一共有 y 朵。1.首先所有的金钱购买 a 花 ,如若购买a花后,仍有剩余的钱,2.则购买b花,或用a花的钱 + 1 换得 b花(注意数量关系)注意 : 1.当a == 1 || b == 1 return 0。
2024-07-25 00:22:06
278
原创 Codeforces Round 960 (Div. 2)(ABCD)
原因:1 ~ y - 1 的前缀和只能是 0 或 -1 ,y ~ x ( x > y ) 的区间和 >= 2 ,那么 1 ~ x 的前缀和 >思路:先将数组排序,若最大的数为奇数个,则Aline赢 ,否则枚举第二大的数 ,若第二大的数加上最大的数个数为奇数个,则Aline赢,依次类推。1 ~ y - 1 的前缀和 ,因为 y + 1 ~ n 的前缀和只能是 0 或 -1 , 1 ~ x 的前缀和 >= 1 ~ n 前缀和,又。3 . y + 1 到 n 的区间中以 -1 ,1 ,-1 , 1交替出现。
2024-07-21 17:47:36
350
原创 P1392 取数
时间复杂度分析:n * ( mlongm ( 排序 ) + klongk ( 调和级数 ) ) == nmlongm + nklongk = 10 ^ 6 (约等于 ) < 10 ^ 8 可以AC。首先说一下 我首先想到的思路 ( 20%通过率 ):通过dfs , 将所有的情况放入priority_queue中(greater<int>),维持堆中的数据为k个 -> TLE。如若你看完题解后,仍有问题,欢迎评论。
2024-07-07 16:10:23
192
1
原创 Linux的基本指令第二篇
tail 命令从指定点开始将文件写到标准输出.使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail -f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容.grep "error" < log.txt:在log.txt文件中查找包含"error"的行。grep "error" log.txt | wc -l:统计log.txt文件中包含"error"的行数。管道将一个命令的输出作为另一个命令的输入,可以实现多个命令的组合和数据处理。
2024-06-23 20:05:03
1087
原创 Linux的基本指令第一篇
当我不显示列出具体目录,则认为是在当前所在的目录(pwd所显示的)当我列出具体目录时,则列出具体目录下所有的目录和文件pwd。
2024-06-16 18:45:38
733
原创 C++进阶篇章:set与map(pair , multiset , multimap)
与 set 不同的是,multiset 允许键值重复,即可以包含相同键值的多个元素。定义:pair包含在 的头文件中 ,其中pair中有两个成员变量 , 一个是first , 另一个就是second。允许重复键值: multiset 允许容器中存在相同的键值,因此可以包含多个相同键值的元素。给定一个key值 ,如果set中存在,返回1 , 不存在,返回0(与find函数相似)给定一个key,如果set中存在,返回该节点的迭代器,不存在,返回set.end()返回的是关于value的引用。
2024-05-27 16:39:25
699
2
原创 C++面向对象的第二大特性:继承
首先容我先向大家举一个列子:我这里定义了一个Person的类在这个基础上,我要定义一个关于Student , Worker 的类由于Student Worker都具有Person类中的成员变量 , 为了实现类的复用,由此引出继承。
2024-05-18 17:17:34
975
3
原创 模版进阶篇章
回顾:函数模版 :不用传类型,编译器会自动推导,和普通的函数调用一样类模版:通过传不同的类型,编译器会自动生成不同的类,然后进行实例化对象注意:调用函数模版时,需要传对象(匿名实例化 或者 有名实例化)调用类模版时,需要传类型非类型模版参数概念:将常量作为模版参数注意:1.只有整形家族才能支持非类型模版参数2.参数在编译时就能确定。
2024-05-03 11:30:00
732
1
原创 C++——数据结构stack,queue,priority_queue
1.堆栈是计算机科学中的一种抽象数据类型,只允许在有序的线性数据集合的一端(称为堆栈顶端,top)进行插入数据(PUSH)和删除数据(POP)的运算。4.stack的底层可以是vector , list , deque(双端队列),默然情况是deque。
2024-04-30 22:49:54
387
2
原创 看了就懂的题解:最长递增子序列的个数(leetcode)
j属于 0 ~ i - 1 if ( nums[i] > nums[j] ) len[i] = max(len[j] + 1 , len[i] );初始值:对于len的最小值为1 , 对于count的最小值也是1(解释:最差情况以自己为最长子序列的,此时count为1,其余情况均大于等于1)难点就在于:如何找到0 ~ i - 1中满足条件的最长子序列,方法:设置一个dp(命名为len)表记录以i位置为结尾的单增最长子序列的长度。:count[i] 可以表示成以i位置为结尾的最长子序列的个数。
2024-04-28 20:49:32
440
2
原创 C++中string的用法总结+底层剖析
在C语言中,我们经常使用字符串进行一系列操作,经常使用的函数如下:增删改查(自己造轮子),C++中设计出string容器,STL库中为我们提供了以上函数,所以我们使用string容器时,就不用造轮子了。
2024-04-19 16:10:42
930
原创 C++内存管理与模版(用法详解)
试分析下列代码// 这个变量globalVar 存放在静态区(原因:globalVar是全局变量)//静态区 是静态变量//静态区,静态变量// 栈区//num1存放在栈区,*num1存放在栈区//char2存放在栈区,*char2存放在栈区这段代码是将"abcd"拷贝下来,开辟空间,放置在栈区//PChar3存放在栈区,*pChar3存放在常量区//这里解释一下pChar3 pChar3是const char* ,所指向的内容不能被修改。
2024-04-15 23:15:48
443
原创 类和对象(下)
运算符重载是具有特殊函数名的函数函数名字为 返回类型 + operator(关键字) + 操作符 + ( 参数列表 )举例: bool operator
2024-04-12 21:56:17
953
原创 类和对象(上)
第一点:当我们没有写构造函数,编译器会自动生成一个构造函数,这个构造函数对内置类型(包括int double char float 指针等)不处理,对自定义类型(结构体和类)调用他自己的构造函数。如果我们没写拷贝构造函数,那么编译器会自动生成一个拷贝构造函数,请注意这一拷贝构造函数是浅拷贝(就是通过字节上面存储的数值,一个一个字节的拷贝)当对象里面有自定义类型时,回去调用它的析构函数,对于内置类型,就调用自己的析构函数,如果没有,就不做处理。struct 定义的变量和函数均是 public(公共属性)
2024-04-09 21:59:29
669
原创 二叉搜索树中的众数
思路:遍历二叉树,得到一个单调递增的数组,转换成数组的众数,用二维数组记录数组中的频率即其对应的数,对二维数组排序(通过频率),依次对二维数组的每一个频率比较,==取,<不取。
2024-04-09 19:41:25
273
原创 反转链表 II(leetcode)
将left~right之间的节点翻转,首先left前的节点的next置为空,right的指针置为空,要有哨兵节点:原因:当left为1时,头结点改变(会影响返回值),为了不让头结点改变,增加头结点。注意:当p1为空时,即left为1,返回值就不是头结点,而是翻转后的第一个节点。栈处理:将left~right之间的节点存入栈中,然后再将栈顶数据倒出。p1指的是left前面的一个 p1->next = NULL。p3指的是right p3->next = NULL;p4指的是right后的一个。
2024-04-08 21:43:52
355
原创 二叉树中所有距离为k的节点
从目标节点的左孩子,右孩子,父亲节点出发去找,左孩子 右孩子 做法简单 , 主要是父亲节点 ,因此我们需要知道每个节点的父亲节点,&& flag[(parent[root->val])->val] == 0 )//由于根节点没有父亲节点,因此要特殊判断。题目中提示说所有值不同,因此我们存储该节点的父亲节点,可以用该节点的值作为下标。然后从左孩子,右孩子,父亲节点找相应的距离节点。写一个函数:需要注意根节点没有父亲节点。还需注意,已经访问的节点不可再次访问。因此要写一个数组,记录哪些节点已访问。
2024-04-06 21:00:07
841
原创 C++语法代码总结
这段代码中print函数不构成函数重载,原因:第一个print函数在s1命名空间域中,第二个print函数在s2命名空间域中,不在同一作用域,因此不构成函数重载。在主函数中,去调用print函数,先在函数声明中得到一个地址(不是函数的地址,只是一个函数声明的地址),链接时,会拿函数名和参数列表去找函数的地址。请注意这段代码同样不构成函数重载,因为展开命名空间域,只是会影响搜索函数/变量的范围,print函数还是在不同的作用域中。但如果调用,会产生调用歧义,而不是函数重载的关系(并且也不构成函数重载)
2024-04-05 21:08:45
720
原创 C++代码语法总结
这里展开命名空间是不会报错的,因为第二个print函数是存放在 a 中的,此时展开它,只会影响搜索函数或变量时的查询范围,而不会影响定义,因为此时两个函数的地址已经不一样了(这两个函数已经不一样了)但此时要去调用print函数,程序会报错,因为编译器不知道去调用哪一个函数,C++中调用函数是通过函数名和参数列表来找函数定义的(这里与函数重载有关)假设我现在要定义两个函数名,都要定义为print(且参数列表要相同,这里跟函数重载有关,下面有详细讨论),此时程序有BUG,// 这两个语句等价。
2024-03-31 21:51:01
415
3
原创 接雨水(C语言)
/ 例如:0 1 0 2 第一个元素进栈 然后 1 大于 0 , 0 被弹出 ,栈为空 , 此时不可能形成容器 ,1 就进栈 ,也可以这样写。{ //这里是为了弹出相同元素 2 1 1 1 5 就要弹出 所有1。//创建一个数组,存下标,这个数值于题目给的数组大小有关。// 这里是为了保证第一个元素进栈,和当栈里为空时跳出。这道题的解法之一是单调栈,并且需保证是递减的,才能形成容器。//在外面让第一个元素进栈,栈为空时,break。首先我们要明白要形成容器,接雨水。
2024-03-30 10:37:57
1768
原创 最长有效括号(C语言)
这道题主要是 思考 当前 ) 与之匹配 ( 在哪里 ,记录下来,最后比较最大值。第三个右括号,最长与之匹配的左括号是第一个左括号 max = 当前位置 - 起始位置 + 1。难点在于:起始位置怎么变:当右括号进入,并且栈里没有左括号时,起始位置发生改变。第一个右括号,由于没有与之匹配的左括号,所以不记录,但要更改起始位置。主要是最后一个右括号与之匹配的左括号为第二个左括号。第二个右括号有与之匹配的左括号,max = 2。第四个右括号,没有与之匹配的左括号。例子:( ( ) ( )
2024-03-29 18:05:45
712
原创 从链表中移除节点(leetcode)
翻转后 8 3 13 2 5 定义一个最大值max == 第一个节点的值依次迭代。翻转后 左侧有更大值 就需要移除。当右侧有更大值 就需要移除。
2024-03-28 20:21:55
363
原创 二叉树中的最大路径和
int Third_Max_0( int left , int right )//返回类型 left /right /0 选取三者中最大的。明确返回时,返回的是最大的左/右路径 (需要与0作比较)+ 节点值。并且最大值有可能出现在任意地方 那么可以把最大值设置为全局变量 ,或传指针。分析:首先明确 路径和 == 左路径和 + 右路径和 + 该节点的值。//这里与题目的范围有关。其次 若左路径和为 <= 0 则不需要加左路径和。这道题的思想仍然是递归。
2024-03-27 19:16:09
331
原创 有效的括号字符串
思路:当s[k] 为 ( 或 * 进栈 , 当s[k] 为 ) 时 , 优先左括号出栈(因为*有可能为空白字符) ,若左括号为空,则*作为(出栈 , 当s[k]为空时,并且左括号的栈也为空,则*作为空白字符,直接返回true , 当左括号的栈不为空时,则要依次比较栈顶元素的下标,并且此时'('出现的位置一定要在'*'的位置前面(因为此时要匹配成() )CheckIsEmpty(&Left_ST) )//判断左括号的栈是否为空。下面的代码写的比较详细。
2024-03-25 20:05:13
487
原创 长度最小的子数组
/将minLen设置为最大值+1,方便判断返回0的情况。int r = -1;//为什么会使用-1 因为下面使用的是++r ,并且可以防止越界。{//z注意r最大只能在numsSize-1处的下标。)//注意是>=因为==时,仍要判断是否满足情况。定义二个指针 l r。
2024-03-23 22:42:36
195
原创 二叉树的右视图
/设置1010是为了防止对数组的越界。if( height + 1 > *returnSize )//height为当前高度,*returnSize为当前已知最高高度。思路:先遍历左子树,把同一高度的值,放在一个数组里,在遍历右数组,将同一高度的值替换,这道题,我看了一个特别好的解法,而且可以不用深度优先搜索,由此想分享一下。
2024-03-21 16:59:23
182
原创 堆的建立与排序
void Adjustdown_min(HPDataType* arr , int size , int father)//size是数组的元素个数,father是当前交换的父亲节点。= size -1 && arr[child] < arr[child+1] )//要防止对右孩子解引用。= size -1 && arr[child] > arr[child+1] )//要防止对右孩子解引用。void BuildHeap_max(HPDataType* arr,int sz)//建立小堆。
2024-03-13 08:55:29
280
原创 链表简单功能的总结
if( *head == pos )//当pos为首节点。下面我将通过创建链表,实现链表的增删,打印,对链表进行复习。if( pos == *head )//相当与头插。测试函数:这里可以随意实现。
2024-03-05 10:43:58
673
原创 链表的中间结点
思想:快慢指针typedef struct ListNode node;struct ListNode* middleNode(struct ListNode* head) { node* fast = head; node* slow = head; while( fast && fast->next) { fast = fast->next->next; slow = slow->
2024-03-04 22:55:31
197
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人