- 博客(37)
- 收藏
- 关注
原创 ACwing寒假每日一题2022打卡 Day 11
原题链接:1960. 闪烁 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1962/思路:状态压缩+找环,不断枚举下一个状态,然后存一下每个状态的步数,如果出现重复就说明出现环了,注意别忘加上起点到出现环的步数,本题主要是训练状态压缩,具体细节见代码Code:#include <iostream>#include <cstring>#include <algorithm>u
2022-02-14 00:16:34
482
原创 Codeforces C. Andrew and Stones
题目大意:一个操作定义如下:每次选三个下标1<=i<j<k<=n,把a[j]的值减2然后各给a[i]和a[k]加1问能不能把2~n-1的所有元素归0,如果能,输出最小次数思路:本题细节较多,需要考虑周全,不然容易wa,首先在读入的时候就先看看有没有偶数出现。如果有,无论如何都是有解的,因为偶数自己可以归0,这样的话就总能拿出1个1去把奇数凑成偶数。如果没有,也不要紧,因为大于1的奇数也可以自减,然后拿出1个1去凑别的奇数,但注意,大于1的奇数自己不能归0,需...
2022-02-14 00:10:37
856
2
原创 Codeforces B. MEX and Array
题目大意:给定一个序列,求出一个最大的sum,sum定义:对于一个片段,他的分割后的片段数+分割后每个片段的mex值之和设为X,sum就等于给出序列的所有子片段的X值和思路:首先要求出最大的sum就要保证每个子段的X最大,而仔细观察不难发现,对于任意片段,其X的最大值等于其片段长度加片段中0的数量,这个结论为什么正确呢?举个例子,如片段{0,1,2},他的X值是1+3=4,而无论如何分割,他的X值最大为4,如{0},{1},{2}{0,1},{2}{0},{1,2}这些值不可...
2022-02-13 23:54:15
889
原创 Codeforces C. Monsters And Spells
思路:本题比较难想,但一旦想到是区间合并的话就很简单了,对于每个数就扩成一个区间去处理就完事了,合并完区间后会发现每个区间的长度之和就是答案Code:#include<iostream>#include<cstring>#include<algorithm>#include<vector>using namespace std;typedef pair<int,int> PII;const int N =...
2022-01-24 00:23:34
590
原创 Codeforces B. Minor Reduction
思路:注意分类讨论,首先如果选出的两个数加起来小于10,那序列位数减少,值必然变小,但相对于这一位来说必然变大(如2+3=5)或者不变(如1+0=1),所以必须让这种情况尽量靠前。如果两个数加起来大于10,那相对于这两位来说必然变小(如2+8=10)或者不变(1+9=10),所以必须让这种情况尽量靠后。由于这两种情况的处理方法是对立的,所以分两种情况,存在加起来大于10的情况和不存在加起来大于10的情况分别讨论。Code:#include <iostream>...
2022-01-24 00:16:24
573
原创 Codeforces B. Card Deck
思路:首先贪心肯定是不择手段的把大的数放在最前面,这种平方级运算大数必须靠前,不然低平方的常数再大也不肯能弥补高平方,所以这题就变成了找最大值了,预处理出来整个区间的前缀最值就行了,但遍历得倒着遍历,因为预处理的是前缀最值,倒序遍历到的前缀最值必然是当前前缀最大的,正序遍历则不能保证,因为后面可能还有更大的,然后遍历到了就输出当前片段即可Code:#include <iostream>#include <cstring>#includ...
2022-01-24 00:05:32
258
原创 ACwing寒假每日一题2022打卡 Day 10
原题链接:1969. 品种邻近 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1971/思路:按题目要求模拟就行了,不要暴力,重点是动态处理,用O(n)的做法就行了#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const.
2022-01-23 23:55:01
302
原创 ACwing寒假每日一题2022打卡 Day 9
原题链接:1978. 奶牛过马路 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1980/思路:维护两个数组Smax,Smin分别代表每个点的前缀最值和后缀最值对于不相交的情况,当且仅当max(b[0],b[1],b[2]...b[i-1])<b[i]&&min(b[n-1],b[n-2],b[n-3]...b[i+1])>b[i],所以先将下端点排序,然后维护一个前缀最大值数组和后缀最.
2022-01-23 23:49:35
306
原创 Codeforces 1624C Division by Two and Permutation
思路:首先大于n的数肯定不能放,不断/2至小于等于n再考虑,其次对于任意小于等于n的元素,一定是能放则放,放不下就/2退位。不要想明明能放却不放,先去补更小的空位,这样看似合理,但一定不正确,因为你去补更小的空位,本该属于你的位置就空出来了,就又得有新的元素去救,但你会发现,这个元素一定能不断/2最终变成你去补的元素,所以这就多次一举了。Code:#include <iostream>#include <cstring>#include <...
2022-01-12 01:06:32
353
原创 Codeforces 1480B The Great Hero
思路:本题的核心转化:即使打败完所有敌人后英雄再死亡也可以,这就等于英雄在受到致命伤害后可以免疫一次,如果能想到这个这题就简单了。计算英雄攻击回合数的公式:怪物血量/英雄攻击力,上取整Code:#include <iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;const int N = 1e5+10;...
2022-01-12 00:57:51
189
原创 ACwing寒假每日一题2022打卡 Day 8
原题链接:1987. 粉刷栅栏 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1989/思路:哈希+差分。本题虽然n比较小,但a[i]的规模很大,所以想到用map储存下标,奶牛移动无非也就是给某个区间都加1,这就想到差分了,但注意一点,差分map中的点是离散的,要还原成原数组需要求前缀和,但由于值域规模很大,所以直接求前缀和肯定超时,所以需要注意差分数组的性质,如下图所示:所以会发现只需处理出现在差分数组里的元素即可,.
2022-01-12 00:48:58
260
原创 ACwing寒假每日一题2022打卡 Day 7
原题链接:1996. 打乱字母 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/1998/思路:字符串排序+二分。本题需要的前置知识:sort可以直接排序字符串,按每个字符的字典序排序,sort也可以排序字符串数组,按每个字符串的字典序排序了解了以上语法,就把这道题当成整数二分去做就行,把字符和字符串都看成整数,这题就十分清晰了。注意整数二分的两者靠拢模式,本题字典序小的应该尽量往左,大的应该尽量往右Code:#
2022-01-12 00:30:23
321
原创 ACwing寒假每日一题2022打卡 Day 6
原题链接:2005. 马蹄铁 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/2007/思路:直接dfs暴力枚举所有路径然后求最大值就行,唯一麻烦一点的地方就是还得写个check函数判断一下路径是否合法,这题数据范围小,就是练暴力用的,具体细节见代码Code:#include <iostream>#include <cstring>#include <algorithm>us
2022-01-11 11:20:12
494
原创 ACwing寒假每日一题2022打卡 Day 4
原题链接:2019. 拖拉机 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/2021/思路:双端队列bfs,本题存在权重为0的边,即没有干草堆的路径,由于本题求的是最少移除干草堆的数量,所以有干草堆的路径可能对答案有贡献,即边权为1,这种情况显然直接bfs解决不了,因为普通bfs只能处理边权都一样且大于等于0的图,所以本题采用双端队列,每次入队的时候判断一下,把边权为0的边入队头,边权为1的边入队尾,直观上来讲就是先处理非干草堆
2022-01-11 11:15:48
325
原创 ACwing寒假每日一题2022打卡 Day 3
原题链接:2060. 奶牛选美 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/2062/思路:bfs+暴力枚举,看过我博客acwing题库部分的读者应该很熟悉,这道题的变形是我第一篇写的博客,详情可以参考ACwing 4004.传送阵_机械之忍的博客-CSDN博客原题链接: 4004. 传送阵 - AcWing题库https://www.acwing.com/problem/content/4007/思路:如果起点和终点...
2022-01-05 00:09:49
832
原创 ACwing寒假每日一题2022打卡 Day 2
原题链接:2041. 干草堆 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/2043/思路:差分模板题,直接写个差分函数动态更新即可,具体细节见代码Code:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1e6+10;int b[N];
2022-01-05 00:05:13
699
原创 ACwing寒假每日一题2022打卡 Day 1
原题链接:2058. 笨拙的手指 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/2060/思路:由题意,二进制中改变一位,三进制中改变一位,两者改完后恰好是同一个十进制数,直接暴力枚举二进制和三进制的每一位改变情况再变成十进制找重复就行了,注意是枚举二进制和三进制,不要枚举十进制分解,不然n=1e9超时Code:#include<iostream>#include<cstring>#incl
2022-01-05 00:01:12
798
原创 Codeforces 1607D Blue-Red Permutation
题目大意:给一个整数序列和一个字符串,字符串的每位字符对应序列的每位数字,对于整数序列,字符是B则只能减,字符是R则只能加,问能不能通过上述操作使序列变成1~n的排列思路:本题贪心思路确实难想,应该是按字符排序,保证先处理完全部的B再处理A,因为用for循环枚举处理1~n的每个数的时候必须减法优先,原因是只有从小到大处理才能包含整个1~n的序列。这道题的贪心表面上是排序数字,从小往大贪心,其实是排序字母,从减法往加法贪心Code:#include <iostream&...
2021-12-14 22:35:50
1146
原创 Dijkstra求最短路详解(朴素版+堆优化版 带模板)
dijkstra的步骤,一共四步:设起点距离为0 循环n次 每次找出集合外距离最短的点,将其放入集合中 利用刚才放入的点更新与之相连的所有点的距离其思想是依据贪心,每次利用集合外距离最短的点更新其他点的最小值,一共n个点所以一共循环n次(事实上循环n-1次就行了,因为最后一次的最后一个点一定已经被剩余所有点更好了),这样更新结束后终点的距离一定是最短距离举个例子:对于下图最开始设dist[1]=0,用v1更新与之相连的点的距离,注:v5、v6等还未标记距离的点距离应被初始化为0x
2021-12-09 08:17:09
926
4
原创 蓝桥算法训练 P0802
思路:本题没有乘除操作,也没有括号,仅仅是加和减,比较容易。开两个栈,分别储存运算符号和数字,然后遍历一遍字符串动态处理数字就行了,但是需要注意,一定要动态更新数字的操作!每存一个符号就要操作一次,千万不要等数字和符号都存好了再统一操作,因为操作的过程是从栈顶拿数和符号,比如这种情况“1+3-6+5”本应等价于“5+(-6)+3+1”,但实际操作起来就变成了“3-(5+6)+1”,因为符号位与加号相邻的减号没有考虑到,为了避免这种情况就要时时进行操作。具体细节见代码Code:#incl...
2021-12-07 10:27:37
1339
1
原创 Codeforces 1566B
题目大意:可以任意切割给定序列,对于任意序列,其MEX值等于该序列未出现的最小整数,求给定序列的最小的总MEX值,即所有切割后序列的MEX值之和思路:我个人做这个题时分了三种情况,首先全1不用说,怎么都是0,全0的话越切越大,所以必然是1,所以这题就成了处理01混搭的序列,而对最小值最有影响的是0,因为一旦单分出0,MEX值就要+1,所以自然想到指针的思想遍历序列,但这里需注意,找的是连续的0片段数量,不然最终求的MEX值必然大于等于最小值。Code:#include <io..
2021-12-01 23:27:09
227
1
原创 Codeforces 1593C
题目大意:给出老鼠和洞坐标,每次老鼠方只能有一只老鼠移动一步,猫也移动一步,问最多有几只老鼠能进洞思路:从右往左贪心一下,由于每次只能移动一只老鼠,所以本题与某个位置的老鼠数量无关,所以按照离洞由近至远的顺序枚举一下总步数,总步数应小于n,不然猫会追上最后一只老鼠。每只老鼠进洞需要的步数应为n-a[i]Code:#include <iostream>#include <cstring>#include <algorithm>using...
2021-11-30 22:41:23
936
1
原创 Codeforces 1592A
题目大意:给出一堆武器伤害,特工不能连续使用同一种武器,请问特工至少需要几步把敌人击杀思路:贪心一下,只需在前两个最高伤害的武器间反复切换攻击就行,所以只需考虑反复切换几次才能击杀敌人,但注意考虑特殊情况,不要有遗漏。Code:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 2010;typedef l...
2021-11-30 22:33:25
519
1
原创 Codeforces 1611A
题目大意:可执行任意次操作, 操作内容:翻转前k位,但必须是严格1~k,不能跳着翻转。问最少执行几次操作使该数字变成偶数思路:其实合法情况只有三种,0、1、2,0就是本来就是偶数,不用操作,1就是第1位恰好是偶数,这样直接翻转整个序列就能把偶数转到最后了,2代表偶数在其他位置,由于只能翻转1~k位,所以需要先把偶数转到首位,再整体翻转。如果该数字没有一个偶数位自然就是无解Code:#include <iostream>#include <cstring&g...
2021-11-29 23:07:46
379
原创 Codeforces 1609A
题目大意:可执行任意次操作,操作内容:找两个元素,其中一个必须是偶数,偶数元素除2,另一个元素乘2,问怎么做才能使整个数组元素之和最大思路:初步思路使放大某个元素,把除该元素外所有的元素都除/2到底,以此使该元素放到最大,这样肯定比均分求和要大,但这个元素如何选择?应该选底数最大的,也就是说把数组内所有元素一直除2直到不能除为止,然后从这些数里挑最大的放大,由于底数更大,所以每次乘2放大肯定也更大Code:#include <iostream>#include ...
2021-11-29 22:55:35
259
原创 Codeforces 1607C
题目大意:每次找到序列的最小值,删除最小值,然后剩余所有元素减去该值,反复执行这个操作,直到序列就剩一个元素,问反复执行该操作的过程中,出现的最小值最大是多少思路:其实仔细观察不难发现,这个题的本质就是序列从小到大排序后的后一项与前一项元素的差,然后输出所有的差里最大的,因为你会发现这个操作只跟最小值和次小值有关。Code:#include <iostream>#include <cstring>#include <algorithm>...
2021-11-25 22:10:46
223
原创 Codeforces 1610B
题目大意:以回文顺序遍历整个序列,可以删除不对称的元素,但只能删一种元素的任意个,问能不能删除一种元素的任意个使序列变成回文序列思路:以回文顺序遍历序列的时候,不对称的元素必然成对出现,所以只需枚举一下这两个元素即可,具体细节见代码Code:#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 2e5+10;i...
2021-11-25 21:58:40
642
原创 提高课dp 摘花生(dp详解,适合初学者阅读)
先给出动态更新过程:遇到这个题,如果没学过dp,第一反应应该是爆搜,枚举所有可能路径,筛选最大值,但这种方法显然太慢了,连16*16的方阵都处理不了。对于这道题,我随便找除原点外的一个点,它不是从左过来就一定从.
2021-11-18 10:12:29
526
2
原创 蓝桥杯 连号区间数
原题链接:1210. 连号区间数 - AcWing题库https://www.acwing.com/problem/content/1212/思路:首先想想暴力,直接两重循环暴力枚举所有子区间,然后给每个子区间排序,再遍历一遍子区间看看是不是连号区间。下面给出暴力代码片段bool check(int l,int r){ sort(backup+l,backup+r+1); for(int i=l+1;i<=r;i++) { if(backup[
2021-11-16 00:00:23
229
1
原创 蓝桥杯 交换瓶子
原题链接:1224. 交换瓶子 - AcWing题库https://www.acwing.com/problem/content/1226/看过我博客的读者对这题应该有些眼熟,没错!不久前我刚写过小朋友排队的题解,这道题是不是很像呢,也是跟逆序对有关系,只不过这道题的逆序对稍微有些特殊思路:我刚拿到这个题,第一反应就是逆序对,再看了眼数据范围,顿时就高兴了起来,本题数据范围才1e4,完全可以双指针暴力枚举,妥妥的O(n²)不超时,但当我打完双指针跑样例的时候,发现第二个样例都过不了,于是我仔细琢
2021-11-10 23:33:47
586
原创 ACwing第21场周赛 变成1
原题链接:3998. 变成1 - AcWing题库高质量的算法题库https://www.acwing.com/problem/content/description/4001/思路:高精度+模拟本题思维难度一般,难点在于细节比较多。如果当前位置是0,直接移出数组,如果是1就处理一下该位置左侧连续的1,将连续的1全都变成0,然后将最后一个连续1的左侧的0变成1比如10111,遍历最后一位时需要+1,于是变成了11000,这也就是将该位置连续的1全都变成0,然后将最后一个连续1的左侧的0变成.
2021-11-07 23:56:07
941
原创 蓝桥杯 小朋友排队
原题链接:1215. 小朋友排队 - AcWing题库思路:贪心+树状数组本题是模拟的冒泡排序的流程,首先从直觉上判断,每个小朋友的怒气值既然跟被交换的次数有关,那就肯定跟与其相关的逆序对数量有关,而既然要求与其相关的逆序对,只需求出该小朋友左侧比他高的小朋友的个数和右侧比他矮的小朋友的个数即可。那么下一个问题是,如何证明直觉做法的正确性,换言之,如何证明这样求出来的怒气值最小。下面我给出证明过程供参考:对于冒泡排序,如果存在k个逆序对,那至少要交换k次才能得到正确的顺序,因为冒泡排序每
2021-11-04 23:50:49
242
1
原创 《信息学奥赛一本通》 数星星
原题链接: 1265. 数星星 - AcWing题库思路:由于k级星的定义是:该星星的左下方(包含正左和正下)有 k 颗星。并且题目已经保证了星星按y坐标增序给出y坐标相同的按x坐标增序给出,所以对于任意一颗星,它的左侧的上方一定没有其他星。所以如果A星左侧有B星,那么B星必然出现在A星左下方(含正左和正下)所以对于任意一颗星,k的值就是该星左侧星的数量(包含自身下标但不含该星星本身)进一步抽象成:设该星星横坐标为x,我们只需求出区间1~x中有多少颗星,但不包含该星自身。很显然这是个动态
2021-11-03 22:59:16
214
原创 今日头条笔试 机器人跳跃问题
原题链接: 730. 机器人跳跃问题 - AcWing题库思路:本题的难点就在于对题意的分析:假设机器人在第 k 个建筑,且它现在的能量值是 E,下一步它将跳到第 k+1 个建筑。如果H(k+1)>E,那么机器人就失去H(k+1)-E的能量值,否则它将得到E-H(k+1)的能量值刚看到这些信息可能无从下手,乍一看好像还像个模拟,但如果稍微对题目信息做一下变形,会惊奇的发现一件事:如果H(k+1)>E,E=E-(H(k+1)-E)=2E-H(k+1),如果H(k+1)<E,E=E
2021-11-02 08:56:54
145
原创 蓝桥杯 错误票据
原题链接: AcWing 1204. 错误票据 - AcWinghttps://www.acwing.com/activity/content/code/content/1981205/思路:本题思路很简单,把所有输入的数存到数组里,排序,然后遍历一遍就行了。判重的话就开个新数组记录一下每个数的出现次数即可。本题的难点就在于处理输入,需要对C++语法比较熟悉做法如下:处理输入的所有数字 遍历计数器数组,找到重号 遍历一遍排好序的数组,如果不连续且不是重号,那就是断号,记录下来 分别
2021-11-01 17:33:10
126
原创 蓝桥杯 翻硬币
原题链接:1208. 翻硬币 - AcWing题库思路:首先我们先想想这道题的暴力做法:从左往右依次操作一遍,只要当前位置硬币不匹配,直接翻转,而由于是从左往右操作,所以当前位置-1一定是匹配上了的,所以要翻当前位置和当前位置+1的硬币。操作完后遍历一下两个串,看看是不是都匹配上了,如果都匹配上了再更新答案。然后依次枚举每个起点执行上述流程,这样就涵盖了所有可能了。接下来分析一下暴力的时间复杂度:比较直观,每次遍历一遍,一共遍历n次,所以时间复杂度O(n²),这里说明一下,事实上时间复杂度要
2021-11-01 11:11:58
246
原创 ACwing 4004.传送阵
原题链接: 4004. 传送阵 - AcWing题库https://www.acwing.com/problem/content/4007/思路:如果起点和终点是连通的,就无需建立传送门,直接输出0,否则起点和终点一定不连通,这也就意味着起点和中点位于两个独立的连通块中那首先我们先想想这道题的暴力做法:不妨设起点位于A连通块中,终点位于B连通块中。只需依次枚举A连通块中的每个点(含起点)到B连通块中每个点(含终点)的所有可能距离,然后在这些距离中选择最小的输出即可。到此,暴力的思路完毕,我们
2021-10-31 16:45:16
472
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人