- 博客(32)
- 收藏
- 关注
原创 图的遍历(洛谷 3916)
,之后从值大的那一端开始遍历,找到某个点的最大值就把该值存放到结果数组里,(从大到小递归可以减少递归次数,比如说最大值可以到1,2,3点,那么答案数组下标是1、2、3的元素值都是同一值,之后这三个点便不需要额外递归求值了),具体代码注释如下。因为原图当中某个点能搜索到另一个点,当把图中的边指向反过来,另一个点,能搜索到某给点,比如原图当中1、2、4可以搜索到最大点,当建立的反图(把原图中的边的方向相反),可以得到最大点可以搜索到点1、2、4.,不妨看下面的方法;
2026-02-07 21:22:08
47
原创 利用矩阵存储图的方法
注意:邻接矩阵的默认值,有些时候是 就可以,还有的时候根据题目要求,我们可能需要把初始值设置成最大值。假设 到 之间,存在一条边。邻接矩阵的实现首先开一个二维数组 ,二维数组的大小至少是 n。n的,其中 代表图有多少个点。由此可见:邻接矩阵 其中的g。就是表示了 到达 的状态。
2026-02-06 20:30:19
28
原创 高精度除法
首先定义两个long long 类型数据代表除数和余数,在用字符串类型来接收被除数,在定义两个数组分别是被除数数组和结果数组,先把字符串当中的数据正序存储(便于直接从高位开始除,减少计算量),之和遍历被除数数组,结果数组某位的值等于(被除数数组某位的值+余数*10)/除数。首先输入两字符,利用这两个字符串给被除数数组和除数数组逆序赋值,赋值的同时,需要把数组的第一个元素设置为两数据的长度,我们需要设置四个数组,分别是被除数数组,除数数组,商数组和临时数组(临时数组来存储除数数组经过偏移后的数组),
2026-01-30 21:23:03
46
原创 高精度乘法
由于数超出了long long范围,所以输入两个字符串代表数据,之后创建三个数组,分别代表两个乘数数组还有一个代表结果数组,先把两个字符串的数据逆序存储到两数组中,之后遍历两数组,求每个数组元素的乘积,第一个数组i元素值和第二个数组j元素的值乘积之和结果会落在结果数组的i+j-1的位置上,当两数组全部遍历完之和,乘积结束,最后输出结果,具体代码以及细节如下。
2026-01-30 20:52:45
29
原创 高精度减法
此时我们不在利用int/long long 来存储数据,而是用string来存储数据。在输出的时候,要注意可能会有前导0(就是比如222和221,按以上方法会输出001,我们需要删除前面的两个0),删除前导0之后在进行输出(注意如果前面被除数和除数进行了交换,需要加负号),具体代码/注释如下。当在减法计算中,有时候数很大,当超出long long 的范围的时候,我们需要利用高精度算法来计算。
2026-01-28 21:44:43
201
原创 高精度加法
用字符串存储两个很大的整数,之和再开辟两个数组,把两个字符串里面存储的数字逆序存储在int数组中,(保证两个数字的低位对齐,方便计算),之和再遍历长度最长的那个数据,让两个数组对应下标的值相加,这个时候会产生进位问题,(以十进制为例)当两个数据该下标对应的数之和大于十,该下标+1的值加上该下标的值/10,并把该下标的值更改为原本的数%10即可(其他进制,只需要把代码里面的10更改为n(n代表n进制)当然16进制在存储数据时候需要扫转换,因为存在字母代表数字),
2026-01-28 21:32:54
128
原创 信息奥赛一本通 1314 过河卒
开始对f数组的第一行第一列初始化为1,(第一行/第一列只能单一的通过右移/下移到达)如果某个点可以被马访问到,那么该点和他该行/列后面的点到达方式都是0 (便于之后给每个点赋值),最后遍历剩余行/列的点,给每一个点的到达方式赋值(给该点的到达方式=左边的点到达方式+上边的点的到达方式),如果该点马可以访问到,就把他的到达方式赋值为0。再开一个数组代表马可以访问到的点,并把这个数组马能访问到的点初始化为1;接着开一个数组f代表每个点到达的方式的个数。
2026-01-24 09:36:08
210
原创 信息奥赛一本通 1313 位数问题
也就是把前面n-1位数的偶数个3的个数*9(012456789)这几种可能,如果前n-1位数是奇数个3,则最后一位数字必须是3,才满足条件,也就是,前n-1位数3是奇数个的数个数*1(3),将这两种情况数加起来,结果就是该位数的偶数个3的数的个数。把前面n-1位数3的个数是奇数的个数*9再加上,若是前面n-1位数3的个数是偶数,最后一位只能是3,把前面n-1位数3的个数是偶数的个数*1 结果就是当前位数奇数个3的个数。要求奇数个3的数的个数,也一样,若前面n-1位数3的个数是奇数,则最后一位有九种可能。
2026-01-23 20:54:41
221
原创 信息奥赛一本通 1321 删数问题
本文提出两种算法来删除高精度正整数中的s个数字,使剩余数字组成最小数。两种方法都采用贪心策略:在数字序列末尾补0,当遇到降序时删除前一个数字。方式一通过循环控制删除次数,每次从头遍历寻找降序位置删除;方式二通过移动下标优化遍历过程,删除后根据位置调整下标。最后都需删除补的0并处理前导零。两种方法时间复杂度均为O(n^2),但方式二通过下标优化减少了不必要的遍历。样例输入"175438"删除4个数字后输出最小数"13"。
2026-01-22 21:00:31
152
原创 信息奥赛一本通 1324 整数区间
定义结构体,代表区间,对其按照右边界值大小进行升序排序,之后定义一个右边界值=第一个区间的右边界值,遍历区间,当后一个区间的左边界值大于定义的右边界值,就需要在集合里面加一个数,这个时候需要更新定义的右边界值等于当前的区域的右边界值一次循环。
2026-01-22 20:55:31
113
原创 信息奥赛一本通 1223 An easy problem
根据上面的数学知识,我们可以先求我们已知的数的二进制数当中的1的个数,再从已知数开始往大的数遍历,寻找和自己对应二进制。数学知识:一个数的二进制数和比他小1的二进制数按位与得到的二进制数相较于原本的二进制数1的个数少一;数具有一样1的个数的数。
2026-01-21 21:03:01
170
原创 信息奥赛一本通 1311 求逆序对
就说明会有逆序对,由于作用两个数组都是有序的,所以,当左数组的某个元素大于右数组的某个个元素时左数组该元素的后面所有元素都会大于右数组这个元素,即右数组这个数产生的逆序对的个数就是左数组的该元素(包括该元素)后面的元素个数;本题需要根据归并排序的思想来做,在归并排序的过程中,需要将一个无序数组成若干个两个部分(有序),之后需要比较这两个部分数组的大小,按顺序放入一个数组中让新数组变成一个有顺序的数组,在比较的过程中,如果(在组合两个有序数组中)左边的数组值大于右边的数组值,递归,直到所有元素排好序。
2026-01-21 20:47:54
236
原创 信息奥赛一本通 2037 约瑟夫问题
(保证每次数数到m的人的编为对应于数组的第一个元素),每次完成这个过程相当于数一次数,计数器加一,当计数器和定义的m相等时,让数组的第一个元素出去(要找的人)总人数减一,重置计数器,以此循环直到人数为一个人的时候结束。先将每个人对应编号和数组下标对应,之后进行循环,并且定义一个计数器,来记录数数的数字。将数数的过程转换为将第一个数放在数组末尾,其余元素依次向前移动。
2026-01-19 17:37:58
187
原创 信息奥赛一本通 2036 开关门
思想:让所有门放入一个数组里面,并初始化为0;对每个门进行循环的同时,对人也进行循环,只要i%j==0就让门的状态改变,最终,数组值为1对应的门就是所求的。此时最后会对们的状态改变(因为对们的状态进行奇数次操作,们的状态就会改变),因此本题最后转换为找完全平方数。因为本题门数和服务员的数量相等所以当门数的编号是完全平方数,它的约数的个数是单数,
2026-01-17 20:44:18
113
原创 信息奥赛一本通 1100 金币
最后根据第几组,对金币求和,再减去超过n的几天*(那组一天发的金币)开始让day=0,val=1,从第一天到天,每过一天让day++,先根据天数,累计求和看看当第n天的时候是第几组(发几个金币一天)当day和val相等的时候,意味着这一组结束了,到下一组。就让day=0,val++;之后让sum对val求和即可。
2026-01-17 20:37:45
172
原创 信息奥赛一本通 1032 分解质因数
思想:从最小的质数(n的约数)开始往后寻找,一旦找到了,就让n一直除这个质数,直到除不尽为止(同时需要时刻更新n的值),继续往下找.
2026-01-16 21:10:58
104
原创 最小公倍数
对于三个数(及大于三个数),先找两个数的最大公倍数,再结合第三个数找三个数的最大公倍数,以此类推。所以lcm(a,b) * gcd(a,b)=a*b;
2026-01-16 20:59:19
250
原创 信息奥赛一本通1080 余数相等问题
即转换为求两个数的最小公约数,而最小公约数,可以通过先求两个数的最大公约数(两个数的约数,都是它们的最大公约数的约数。,最后对这个最大公约数进行从小到大遍历,若找到i让最大公约数取余为0,直接返回,这个数就是两个数的最小公约数。,利用两个数的差值,可以推出x就是所求两个差值的约数,题目所求。思想:利用余数相等,求三个数的两个。
2026-01-15 10:31:27
191
原创 C++中的堆排序
最后再对其从根节点开始维护使其成为大根堆,之后把该树的根节点和该数组的最后一个元素进行调换,(循环n-1次)完成排序。之后从最后一个非叶子节点开始一直到根节点去维护该树让其成为大根堆(根节点比他的任何一个子节点的值都要大)对数组元素进行树构造,开始满足第一个元素是根节点,i*2+1是其左节点,i*2+2是其右节点。
2026-01-06 09:47:37
203
原创 在c++中指针和引用的区别
6. sizeof引用得到的是所指向变量(对象)的大小,sizeof指针得到的是指针的大小(指针的大小和变量类型无关,之和自己编译器的环境有关,x86-->32位编译环境-->4字节、x32-->64位编译环境-->8字节)5. 引用比指针更安全,指针存在野指针、空指针、悬挂指针(指针指向的内存空间被操作系统收回,但指针依旧指向它,会引发一系列问题)7. 引用作为函数参数传递时,传递的是实参本身,指针作为函数参数传递时,传递的是指针变量的值。3. 访问实体方式不同,指针需要自己解引用,引用则是编译器处理。
2026-01-05 09:31:47
166
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅