蓝桥杯
文章平均质量分 51
归忆_AC
for dream in szu...会看消息,欢迎交流。
实验报告仅供参考!
展开
-
【蓝桥杯2143】最少刷题数(模拟&java)
可以排序后取中位数,但是中位数可能有多个,可能往左延伸也可能往右延伸,需要考虑的情况有点麻烦。如果直接用模拟的话,可以简单直接地找到符合题意的中位数以及区间。最后再for一遍原数组判断输出即可。原创 2024-04-17 15:45:20 · 145 阅读 · 0 评论 -
【蓝桥杯2142】字符统计(字符串&java)
送分题,没什么好说的,思路见代码注释。原创 2024-04-10 16:17:16 · 256 阅读 · 0 评论 -
【蓝桥杯3542】魔法阵(线性dp&最短路径&spfa算法&java)
此题的难点在于怎么把最短路径问题和动态规划问题结合起来。代码中使用dp[v][kk]表示从第0点到第v点,使用魔法抵消kk点伤害后的最小伤害。代码中使用了Edge存储边(类似结构体),但是只存了边的到达点和权值,而没有边的出发点,为什么呢?因为在后面的动态规划中,需要根据起始点来遍历边,如果把起始点u也放入Edge,那么每次取边都需要遍历所有的边。因此在数据结构上使用容器嵌套,Vector vector。原创 2024-04-10 15:08:35 · 489 阅读 · 0 评论 -
【蓝桥杯3541】最大开支(优先队列&java)
计算出每一个项目丢人进去的收益并排序,丢人时直接取出队列队头的项目即可。然后再将(k、x+1、b)入队。若队头元素<=0,即收益最高的项目收益<=0,说明已经达到了最大收益。那么我们只需要找到抛物线停止递增时的人数x即可,当项目每多一个人时,收益为(k(x+1)+b)(x+1)-(kx+b)x =根据题意知,当前项目的花费为max(kx+b,0)*x。由于每个项目的k、b不同,因此往里面丢人时的收益也不同。排序的优先队列,加入每个项目的(k、x、b),由。收益是可能超出int最大范围的,所以用long。原创 2024-04-08 21:30:58 · 288 阅读 · 0 评论 -
【蓝桥杯3540】合并石子(区间dp&java)
由第二个minHeapNums[1][2]的值赋值为1后(说明第1个堆和第2个堆合并为1个堆,此时区间[1,3]应该只剩下2个堆),minHeapNums[1][3]的值还是3可知需要更新。然后后面再更新minHeapNums数组和cost数组的值,若区间[i,j]的堆数小于区间[i,k]和区间[k+1,j]的堆数之和则更新。用minHeapNums[i][j]表示区间[i,j]的不同颜色的堆合并后的最小堆数。用三维数组dp[i][j][c]表示区间[i,j]且颜色为c的石堆合并所花费的最小代价。原创 2024-04-08 00:59:00 · 524 阅读 · 0 评论 -
【蓝桥杯3539】买二赠一(思维&贪心&队列&java)
根据上图我们可以推测出一种贪心解法:首先排序,然后从右边开始往左边遍历,若一个数找到两个大于其两倍的数就说明可以配对。经过观察可知,取的两个大值都是最右边的两个,因此我们可以将内层循环改为队列,这样就将时间复杂度优化到O(n)了。过了70%数据,后面30%报超时,说明思路没有错,就是需要优化一下时间复杂度。Arrays.sort的复杂度是O(n log n),主循环的时间复杂度是O(显而易见,因为值过大,所以毫无疑问肯定是要选两个200并免费取走80的。涉及到数的大小的话,那肯定是先从小到大排序一下。原创 2024-04-07 11:02:11 · 290 阅读 · 0 评论 -
【蓝桥杯3538】合并区域(bfs&java&模拟)
初次尝试时,我想的是不需要实现合并,可以转化为左边最大区域+右边最大区域即为结果(如题目所给例图),当然也有可能是两区域中的某个“内陆”区域最大(如下图所示)旋转90度的公式可以推导出来,可以看出原矩阵的[i][j]变为旋转90度后的矩阵的[j][n-i-1]。题目的意思是给你两个n*n的矩阵,你需要将其以不同方式进行合并,并最终求得最大区域的面积。思路理顺后很好解决。只过了百分之十的数据,没有考虑到左边的区域将右边的两个区域连通起来的情况。合并后用bfs求最大面积的方式大体同解题思路一,是很常规的解法。原创 2024-04-04 20:30:49 · 371 阅读 · 0 评论 -
【蓝桥杯4985】蜗牛(动态规划&java)
算是比较直接的一道动态规划题目,打个草稿找出计算公式即可。原创 2024-02-05 17:27:06 · 826 阅读 · 0 评论 -
【蓝桥杯3536】矩形总面积(模拟&规律&java)
但是很快就否定了这个想法,因为面积可能会很大,甚至超出所能开辟的数组范围,而且坐标有四个象限,有正负。当然,正负可以通过同时加上最小值的绝对值来解决,毕竟挪个位置面积是不变的。注意:数据类型要用long,因为根据题目说明的数据大小,相乘后可能会超出int能表示的最大范围(int最大值略大于10的9次方)。最终的方法就是通过画图找规律得出的,通过分析两个矩形的边界关系得出以下结论,可以求得矩形重叠部分。既然上面的做法是在讨论边界,那么就要对题目的输入——点的坐标,转化一下变成边界。原创 2024-02-04 12:12:56 · 546 阅读 · 0 评论 -
【蓝桥杯3535】数组分割(三种方法)(动态规划&规律&java)
但是这样有缺陷,因为是以所选的数之和为列,但是根据题目给出的数据范围,这个总和可能会很大很大,超出数组所能开出的最大范围,即int表示的最大值。题目说了一大堆,其实意思就是:给你一个数组,你需要把数组拆分成两半,并且每一半的所有数的总和需要为偶数(若数为0则总和视为0,也是偶数)。推导出的公式为dp[i][j] = dp[i - 1][j] + dp[i - 1][j - nums[i]]。最终的结果就是dp[n][0](n为可选的个数),比如下面的dp[7[0]=64,dp[2][0]=4。原创 2024-02-03 14:53:59 · 1485 阅读 · 0 评论 -
【蓝桥杯3492】日期统计(子序列&迭代&暴力&枚举&java&String类&日期类&集合类)
这个思路是想着用二进制形式的数去模拟取位,1则取该位,0则不取,结果for循环的i可以达到2的四十多次方.......这个代码的思路是用4层for循环找到剩下的四位数,加上2023后再进行判断日期是否合法。其实可以用dfs替换4层for,不过看在复杂度不大的情况下就没必要再花时间去构思了。块中调用这个方法,如果发生异常,控制流会跳转到匹配的。是位运算中的左移操作,它们的结果是不同的。块中的代码引发异常时,控制流会转到匹配的。块中,可以编写有可能引发异常的代码。块中,可以编写处理异常的代码。原创 2023-11-24 20:30:00 · 543 阅读 · 0 评论 -
【蓝桥杯3496】2023(搜索&模拟&枚举java)
问题描述输入输出解题思路一道简单的搜索题,满足以下两个条件则为包含2023:首先这个数字要有2、0、2、3;其次,要有先后顺序。因此,可以设置4个flag来进行状态的更替。注意要找的是不包含的!!!!!AC代码public class Main { public static void main(String[] args) { System.out.println(85959030); /* int ans = 0; for (int原创 2023-11-23 20:54:35 · 407 阅读 · 0 评论 -
【蓝桥杯3526】子树的大小(规律&思维&java)
这道题很容易超时,所以用模拟的话基本写不了(至少我不会),起初我是用bfs模拟,用一个队列去一个节点一个节点的跑,果然,超时了一半样例(代码放后后面)。期间有很长一的段时间,都有一半样例超时。我以为是算法设计的问题,一直在想着怎么优化。后面用一层一层往下,读取该子树每一层的最左边和最右边的节点进行判断的方法做出来的。竟然把int改成long就好了……最开始还想过要不要建树..........还好否决了。这道题确实有点难顶,看了下是蓝桥杯省赛。原创 2023-11-23 19:38:59 · 1099 阅读 · 0 评论 -
【蓝桥杯3491】幸运数(模拟&枚举&java)
下面代码的思路是从1开始一直遍历,将数字转化为String,然后再对前一半的位数和后一半的位数分别操作,最后比对即可。2.前面一半每个位数之和,等于后面一半每个位数之和。注意:提交的时候直接输出数字,不然会超时!原创 2023-11-21 17:50:00 · 133 阅读 · 0 评论 -
【蓝桥杯3513】岛屿个数(BFS&java)
另一个bfs用来排除子岛屿,方法是从每个岛屿起始点的上方一个海水点开始遍历,注意有8个方向!2.边界是0~m-1和0~n-1,不是0~m和0~n。语句通常用于跳过当前迭代的剩余部分,直接进入下一次迭代。有时候,可能需要在嵌套循环中使用。这道题需要用两个bfs解决,一个bfs用来搜索有多少个岛屿(包括子岛屿)。一些需要注意的点:1.输入是一行连在一起的,所以要用字符串读入后拆分。语句,这时可以使用标记(label)来标识外层循环,并在。将跳过外层循环的当前迭代,直接进入下一次外层循环。详细部分见代码注释!原创 2023-11-21 17:04:43 · 418 阅读 · 0 评论 -
【蓝桥杯3501】硬币兑换(枚举&java&迭代)
然后要用两个面值的硬币合成一个面值的硬币,如1个面值为2的硬币+1个面值为3的硬币可以合成一个面值为5的硬币。注意面值为2的硬币只有2个,所以这个合成最多进行2次,也就是面值小的决定合成次数。题目的意思有点绕,直白点说就是:面值为1的硬币有1个,面值为2的硬币有2个,......,面值为2023的硬币有2023个。经过很多次合成后,面值不同的硬币分别有sum_i个(1原创 2023-11-20 19:06:56 · 979 阅读 · 6 评论 -
【蓝桥杯3510】冶炼金属(区间&java)
后来发现有更巧妙的方法,就是每一个对都会得到一个范围,那么只要求得所有范围的交集就是答案了。有种四两拨千斤的感觉。起初看到题的时候还在想着把75 3,53 2,59 2这样的对给存起来,然后用i一个一个试出来。思维,问题转化,区间。原创 2023-11-20 16:38:45 · 229 阅读 · 0 评论 -
【蓝桥杯3533】棋盘(二维数组&java)
其实就是建立一个二维数组,然后根据输入的左上角和右下角的点确定一个矩形区域,对里面的值进行取反(0和1)。注意题目的输出格式!原创 2023-11-20 14:11:39 · 205 阅读 · 2 评论 -
【蓝桥杯3520】翻转(模拟&暴力&java)
刚开始什么ArrayList,Interator都用上了,结果后面发现题目的意思其实很简单......麻了,debug了半天,审题审题审题!理解好题意真的很重要!原创 2023-11-20 12:55:25 · 63 阅读 · 0 评论 -
【蓝桥杯3543】松散子序列(dp动态规划&java)
这位老哥写的分析非常好,推导过程也很清晰,我也标注了一些辅助标记。动态规划,找表达式。原创 2023-11-20 01:58:06 · 335 阅读 · 0 评论 -
【蓝桥杯3500】阶乘求和(找规律)
观察可知,当i到达40后,i的阶乘的末九位数字都是为0的,那么阶乘和只要求到39即可,结果即420940313。既然是求阶乘和的末尾9位数字,那么就先把每个数阶乘的末尾9位数字都输出来看一下。这道题还是挺有意思的,题目看着数很大,其实找下规律就能很巧妙地解决。原创 2023-11-19 22:27:18 · 892 阅读 · 0 评论 -
【蓝桥杯3497】有奖问答(动态规划dp&java)
将问题划分成若干个子问题,并定义问题的状态。原创 2023-11-10 23:24:41 · 947 阅读 · 2 评论 -
【蓝桥杯3552】与或异或(dfs&dp&java)
有点像dp+dfs,从arr[1][0]开始一个点一个点往上走,即arr[1][0],arr[1][1],arr[1][2],arr[1][3],arr[2][0],...,arr[4][0]。同时每个点会改变&、|、^三种运算状态。最后判断arr[4][0],若为1则计数sum++。这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。原创 2023-11-10 22:22:51 · 875 阅读 · 0 评论 -
【蓝桥杯4124】分糖果(dfs&&java)
该算法从图的某一顶点开始,沿着图的边不断向下探索,直到不能再继续为止,然后回溯到上一个节点,继续探索其他分支。两种糖果分别有9个和16个,要全部分给7个小朋友,每个小朋友得到的糖果总数最少为 2个,最多为 5个,问有多少种不同的分法。本题的结果为一个整数在提交答案时只填写这个整数,填写多余的内容将无法得分。在深度优先搜索中,有两种常见的实现方式:递归和使用栈。只要有其中一个小朋友在两种方案中分到的糖果不完全相同,这两种方案就算作不同的方案。当当前节点的所有邻居都被访问过,回溯到上一个节点,重复步骤 3。原创 2023-11-10 19:39:14 · 1283 阅读 · 2 评论 -
【蓝桥杯3493】求和(long&BigInteger&java)
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。是Java中的一个类,用于表示任意精度的整数。它没有固定的大小限制,可以存储任何大小的整数。将字符转换为整数:Character.getNumericValue(char);求 11 (含)至 2023040820230408 (含)中每个数的和。String获取每一个字符:charAt(),返回的是字符;java中的long对应c的long long;原创 2023-11-03 14:41:01 · 246 阅读 · 0 评论 -
【蓝桥杯3499】幸运数字(进制转换&java&Integer&String)
主要考察进制间的转换和获取String变量单个字符并转化为整数。原创 2023-11-03 14:19:21 · 48 阅读 · 0 评论