- 博客(39)
- 收藏
- 关注
原创 P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
这题采用贪心思想,找到最小的两种果子进行合并,不断重复,直至只剩下一种果子。但这种方法效率比较低,两层for循环,所以比较慢。
2024-11-26 15:52:40
380
原创 最小生成树——Prim和Kruskal算法
这个算法和Prim用法是一致的,但是得到的方式却大不相同,Prim是找任意一个结点连着的最小的边,从而不断更新到达各个结点的最小花费。时间复杂度是:O(n*n),更适合稠密图;而Kruskal算法是找到最小的边,看这条边的两点结点是否在相同的集合,如果是,说明形成回路,如果不是,及时更新两结点所在的集合,直至所有集合都是1。时间复杂度:O(eloge),更适合稀疏图。
2024-11-25 21:13:09
314
原创 牛客周赛 Round 69 C-E
一、题目描述:一看这个题目是不是觉得是物理问题,我也觉得是这样的,全反射我都快忘记了,结果发现他居然还能这样看,请看图片:第一种情况:当目标点在小歪所在平面的上面得到的反射方向(3,3,8),这个8=(h-z)*2+z得到的第二种情况:当目标点在小歪所在平面的下面得到的反射方向(3,3,12),这个12=(h-z)*2+z得到的。注意他说了得约分,得到约分后的结果———>于是你还要对他们求最大公约数。
2024-11-25 17:16:00
1210
原创 Djskstra算法
将所有dist[i] (源点到各个点之间的距离的描述)都设置成map[u][i],如果源点到i点有权值,说明是通路,就把u设置成i的前驱,否则,将前驱设置成-1。在(2)中已经找到了离的最近的点,那么我判断非S集合的点是否能够通过最近的点来走捷径,如果可以就依次进行更新dist数组,同时更新前驱p数组。其实dijkstra算法采用的贪心策略是选择特殊路径长度最短的路径。(4)判断是否要结束。即找的最近点没有改变,是初始化指向的源点。(6)最后进行输出打印,用栈先进后出的性质来输出路径。
2024-11-21 21:52:46
239
原创 D. Kousuke‘s Assignment
下面我讲一下最妙的地方:就是他用了map作为哈希表,当我得到一个新的前缀和的时候,我现在map中判断,有没有出现过,如果出现过,并且它的索引>=我的上一个最美子区间的位置,这就说明我找到了一个新的子区间,cnt++,一旦等于的话,其实是我的特殊情况,就是我在最开始就把0给塞进去,map[0]=-1,我的index也是初始化为-1,这个时候当我第一个数为0,是出现了相等的情况,你们可以好好捋一下,我一开始也是有点不理解,后面就是一整个恍然大悟.
2024-11-20 20:05:45
170
原创 牛客周赛 Round 68
我看的题解的思路就是,先统计没有改变任何数之前,数组中有多少个元素能够和别的元素配对组成495的倍数,配对的方法:用两个指针,第一个指针i指向1-495,第二个指针j指向i-495,如果i和j存在,且乘积是495的倍数,分两种情况,当i和j相等时,个数其实是。然后再进行一个for循环,一个一个进行判断,元素+1之后会有几个数组中的元素的个数符合条件,如果比最开始的大,更新,恢复现场,再进行判断下一个........有点想复杂了,但实际上我看的其他大佬写的,真的很巧妙qwq,请看vcr。
2024-11-18 17:25:48
282
原创 详解map与multimap容器
map中所有元素都是pair:pair中第一个元素为key(键值),起到索引作用,第二个元素为value(实值)① map容器默认排序规则为按照key值进行从小到大排序,利用仿函数,可以改变排序规则。map、multimap属于关联式容器,底层结构是二叉树实现的。③ 对于自定义数据类型,map必须要指定排序规则,同set容器。multimap允许容器中有重复key值元素。② 利用仿函数可以指定map容器的排序规则。map不允许容器中有重复key值元素。(5)判断map容器是否为空的函数。
2024-11-16 19:11:04
694
原创 详解模版类pair
pair是一个模版类,可以存储两个值的键值对.first以及.second。常见用途:1️⃣用于需要返回两个值的函数;2️⃣用于容器的元素,如std::map,std::set;pair包含在头文件#include if(a.first!i++){
2024-11-16 01:52:44
545
原创 详解vector容器
本质上vector是一个可以动态扩展的数组。他有一个别称:单端数组。(1)vector与数组的区别数组是静态空间的,vector容器是支持动态扩展的。(2)vector误区但我们在对vector进行动态规划的时候,可能就觉得是在原本的内存空间后面加上新的内存空间,但实际上不是的,而是找到一个内存空间更大的地方,把原来的数据拷贝进去,原来的内存空间将被清空。(3)vector迭代器vector迭代器是支持随机访问的迭代器。
2024-11-15 18:21:59
1619
原创 最全最简单理解迭代器
迭代器变量定义使用iterator关键字,形式为:容器:——iteaator 变量名(如:std::vector::iterator a、vector::iterator a、auto a)。
2024-11-13 22:29:24
1575
原创 Codeforces——B. Medians
给你一个数组 a=「1,2,...,n ,其中 n是多,还有一个整数 k。你的任务是选择一个多的正整数 m 并将 a 分割成 m 个子数组 十。b1,b2,...,bm 这样·数组 a 中的每个元素正好属于一个子数组。·对于所有的 1<i<m ,b;都是**个奇数,即每个子数组的长度都是奇数。。median(median(b1),median(b2),...,median(bm))=k,即所有子数组的中位数数组的中位数#必须等于 k。median(c)表示数组 c 的中位数。
2024-11-09 17:37:09
470
原创 位运算实现N皇后问题
要在n*n的格子上放下n个皇后,要求皇后的同一行,同一列,以及对角线不能有皇后。解决n皇后问题的时间复杂度是O(n!),好的方法可以大量剪枝,大量优化常数时间。
2024-11-08 18:32:35
263
原创 牛客周赛 Round 65 ——D-医生
运用二进制的存储方式病人的身体状况,药材的治疗功效,利用二进制来枚举所有2^k方式——要不要取药材(!非常巧妙-我没想到呜呜)代码上面有注释,我感觉还是比较详细的。看懂的话点个小赞支持一下我吧嘻嘻嘻。
2024-10-28 15:59:21
216
原创 最大连续子序列
因为平方数目的子序列数是可能的,要得到一个线性上限的唯一方法就是找出一个聪明的方法来排除对很多子序列的考虑,而不用真正地计算所有的这些子序列的和。如果一个子序列的和是负的,则它不可能是最大连续子序列的开始部分,因为可以通过不包含它来得到一个更大的连续子序列。如{-2,11,-4,13,-5,2的最大子序列不可能从-2开始,{1,-3,4,-2,-1,6}的最大子序列不可能包含{1,-3}。如{1,-3,4,-2,-1,6},当检测序列{1,-3}后,发现是负值,则表示该子序列不可能包含在最大子序列中。
2024-10-14 20:41:47
784
原创 我们N个真是太厉害了
我们会发现,如果我们把我们想要找的最小的得不到的那个数,如果存在则说明他是通过怎么相加都得不到,就意味着如果我们使用叠加的思想,会发现我们想要加的(排完序的数组)那个数一定是是大于前面数之和的,这就说明他不可能得到了,无论怎么相加,都得不到了们都会比他大,因为数组中一定有1,则说明先将他初始化为1.举个实例:就比如a,b,c ,d(已排序)当a=1,b>2就无法得到所需要的数组,会发现s==1+1==2当b=1时,c>3就无法得到所需要的数组,会发现s==1+1+1==3。
2024-10-13 17:43:16
203
1
原创 牛客网--连点成线
第一种方法:定义四个数组,分别记录点(x,y),当取x时,更新对应y的最小值和最大值,当取y时,更新对应x最小值和最大值,于是有每输入一个坐标点,就更新最大值mm的最大值,当x相等的时候,两点的y值之差的最大值,当y相等的时候,两点的x值之差的最大值。
2024-10-13 16:55:55
151
原创 质因数分解
这个题主要思想是理解n是由两个质数相乘得到的,质数本身的定义就是只有两个因子:1和它本身,假设你由a*b得到,a,b是质数,则由此得到n的因子只可能是1*1,a*b,a*1,b*1,于是只需要i从1到n枚举,看n%i==0,如果成立,则说明说明i是该数的因子,那么n/i将会是最大的那个因子,于是得到了,但是如果想从n开始枚举就会过不了,时间太长了!
2024-10-13 16:46:17
202
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人