题解
文章平均质量分 50
分享各种题解
MangataTS
一个爱折腾的Coder
展开
-
2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)-正式赛 部分题解
比赛链接http://oj.saikr.com/contest/19B.Error思路这道题其实我们贪心加上二分就能做了,首先我们贪心得把 b[1]b[1]b[1] 变得很小,然后构造 b[i]b[i]b[i] 的时候也是贪心的去构造,尽可能比 b[i−1]b[i-1]b[i−1]大1,如果不行的话就让 b[i]=b[i]−epsb[i] = b[i] - epsb[i]=b[i]−eps ,然后我们对这个 epsepseps 的值进行二分查找就好了,详情请看代码代码#include<原创 2022-03-27 14:49:25 · 4983 阅读 · 5 评论 -
小沙的杀球(贪心+模拟)
题面链接https://ac.nowcoder.com/acm/contest/23477/C思路对于每一个位置,如果下一个位置是高远球那么就看当前体力是否能够使用杀球,如果能的话尽量贪就行了,如果不是打的杀球那么就是非杀球,就会恢复体力代码#include<bits/stdc++.h>using namespace std;//----------------�Զ��岿��----------------#define ll long long#define mod 1000原创 2022-01-29 21:16:11 · 885 阅读 · 0 评论 -
小沙的步伐(枚举+暴力)
题面链接https://ac.nowcoder.com/acm/contest/23477/K思路对于每次击球,我们只需要判断击球的点是否是5.因为题目中给出如果不移动那么就不算经过,其余击球点的经过次数都是每次击球ans+2,因为击球完需要回到5这个位置代码#include<bits/stdc++.h>using namespace std;//----------------�Զ��岿��----------------#define ll long long#define原创 2022-01-29 18:54:07 · 573 阅读 · 0 评论 -
牛牛学走路(模拟+暴力)
题面链接https://ac.nowcoder.com/acm/contest/23106/L思路四个字母分别表示的四个方向,我们只需要按照需求模拟这个字符串即可,然后在每一步过程中更新一下最远的距离即可,最后输出代码#include<bits/stdc++.h>using namespace std;//----------------�Զ��岿��----------------#define ll long long#define mod 1000000007#defi原创 2022-01-29 18:47:12 · 777 阅读 · 0 评论 -
小朋友做游戏(优先队列 or 前缀和 + 枚举)
题面链接https://ac.nowcoder.com/acm/contest/23106/J题面思路思路一对于这个问题,我们很显然能想到二路归并,其实也就是模拟,不过我们从两边,安静的小朋友和闹腾的小朋友中选取总共m个小朋友,我们可以用两个优先队列来维护,尽量选择安静小朋友的,那么我们至多选择⌊m2⌋\left \lfloor \frac{m}{2} \right \rfloor⌊2m⌋个闹腾的小朋友,所以直接模拟归并就好啦,复杂度nlognnlog_nnlogn思路二我们对安静的小朋原创 2022-01-27 21:11:38 · 1483 阅读 · 0 评论 -
B站与各唱各的(组合数学)
题面链接https://ac.nowcoder.com/acm/contest/23106/I题面思路需要注意取模问题,稍不注意就溢出了代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000007#define endl "\n"#define PII pair<int,i原创 2022-01-27 20:32:33 · 309 阅读 · 1 评论 -
牛牛看云(二分 or 枚举)
题面链接https://ac.nowcoder.com/acm/contest/23106/H题面思路思路一对于∑i=1n∑j=in∣ai+aj−1000∣\sum_{i=1}^n\sum_{j=i}^n |a_i+a_j-1000|∑i=1n∑j=in∣ai+aj−1000∣这个等式我们会发现,aia_iai的顺序不会对答案造成影响,那么我们很容易想到二分来做,我们先对其排序,然后对每一个i的位置对1000−ai1000-a_i1000−ai进行二分操作,左半边是负数,右半边是正数原创 2022-01-27 20:17:37 · 257 阅读 · 0 评论 -
中位数切分(思维+暴力)
题面链接https://ac.nowcoder.com/acm/contest/23106/F题面思路这个题可以想的很简答也可以想的很复杂,我的想法就是排序完后,每次找到中间位置,看是否大于等于m,如果是的话,我们就更新一下ans的值,然后一直找到不满足或者全部分解完,每找到一个就将末尾的元素删除,这样就能算出中位数了详情请看代码代码#include<bits/stdc++.h>using namespace std;//----------------�Զ��岿��-----原创 2022-01-27 19:44:14 · 781 阅读 · 0 评论 -
炸鸡块君的高中回忆(思维)
题面链接https://ac.nowcoder.com/acm/contest/23106/E题面思路不难发现一个事情,就是每个轮回外面的同学都是减少m-1个的,但是最后一个回合就得特殊判断一下,很麻烦,所以我们换一个思维看,先让m个同学进去,然后再考虑需要的时间单位就好了如果n和m相等的话(因为n是大于等于m的)那么花费时间就是1如果不相等且m为1的话,那么校外的同学永远也进不去给当前的花费加上⌊n−mm−1⌋×2\left \lfloor \frac{n-m}{m-1} \right原创 2022-01-27 19:32:54 · 179 阅读 · 0 评论 -
牛牛做数论(素数+思维)
题目链接https://ac.nowcoder.com/acm/contest/23106/D题面思路结论对于问题一:为2、2×3、2×3×5、2×3×5×7…这些前若干个素 数的积中,最大的且不超过n的那一个,如n=233,则答案为 2×3×5×7=210对于问题二:为[2,n]中最大的素数如果n为1,直接输出-1想法对于问题一,我们要求一个使得H(x)H(x)H(x)最小的x,那么我们希望Font metrics not found for font: .尽可能地小,x尽可能的大,那原创 2022-01-27 19:09:59 · 402 阅读 · 0 评论 -
Baby‘s first attempt on CPU(贪心+模拟)
题面链接https://ac.nowcoder.com/acm/contest/23106/C题面思路其实这道题目只是描述可能有些误导,其实就是按照题目描述的模拟就好了,我们每次如果需要寄存器的读操作,那么就在尽可能远的地方插入空语句就好了,我们可以开一个数组,然后来记录相邻两个程序语句之间空语句的数量,这样我们就能很好的统计两条语句之间的语句个数,详情请看代码代码#include<bits/stdc++.h>using namespace std;//------------原创 2022-01-27 18:44:58 · 518 阅读 · 0 评论 -
AcWing 1945. 奶牛棒球(枚举+二分)
题目链接https://www.acwing.com/problem/content/1947/思路因为第三头牛和第二头牛的间距是在[2Y-X,3Y-2x]以内的,所以我们可以对第三头牛进行二分搜索,然后将得到的左右区间长度的贡献加在ans上面,详情请看代码代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define原创 2022-01-26 23:41:03 · 257 阅读 · 0 评论 -
AcWing 1952. 金发姑娘和 N 头牛(离散化+差分)
题目链接https://www.acwing.com/problem/content/description/1954/思路因为对于每一个牛牛来说都有三个不同的舒适度区间,那么我们最终要求的一个最佳总舒适度点也可以看作一个区间,然后将三部分区间在map上面维护一个离散化的差分数组最后求一个前缀和的最大值即可,这里对于最左边的区间和最右边的区间我们可以定义一个INF=0x3f3f3f3f来表示维护代码#include<bits/stdc++.h>using namespace std;原创 2022-01-26 23:39:44 · 189 阅读 · 0 评论 -
AcWing 1960. 闪烁(状态压缩+枚举)
题目链接https://www.acwing.com/problem/content/1962/思路这题如果用一个数组的话是会炸空间的,所以我们采用状态压缩,因为每个灯的状态只有0和1,那么我们直接定义一个状态表示的是当前的状态,然后由于这个长度是16,所以我们最多能有2162^{16}216种开关灯的状态,我们直接用一个int即可,然后我们发现关于灯的开关状态其实就是那当前这一位和前面一位(环形)做一个异或操作,由于数据一定会出现循环,所以一旦我们发现了循环的地方就直接取模然后继续往后走余下的步数即原创 2022-01-26 23:38:06 · 132 阅读 · 0 评论 -
AcWing 1969. 品种邻近(滑动窗口+枚举)
题目链接https://www.acwing.com/problem/content/1971/思路我们从id较大的点往id较小的点进行遍历操作,然后找出一个满足条件的id就直接输出然后return 0,否则循环完后直接输出-1代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<in原创 2022-01-26 23:36:44 · 152 阅读 · 0 评论 -
AcWing 1978. 奶牛过马路(前缀和)
题目链接https://www.acwing.com/problem/content/1980/思路我们将这个二元组进行排序后就可以得到一个a升序序列,然后将问题转化为判断当前位置的奶牛是否合法,如果合法的话,那么当前奶牛的前面所有奶牛的b点应该都小于当前这个奶牛的b,后面所有奶牛的b都应该大于当前奶牛的b,再进一步转化为前缀最大值和后缀最小值问题即可轻松解决代码#include<bits/stdc++.h>using namespace std;#define ll long l原创 2022-01-26 23:31:38 · 240 阅读 · 0 评论 -
AcWing 1987. 粉刷栅栏(离散化+差分)
题目链接https://www.acwing.com/problem/content/1989/思路通过map进行差分处理,每次处理到前缀和从大于1变到小于等于1的时候就进行一次区间长度统计,每次从前缀和小于等于1变到大于1的时候就更新左区间的位置代码#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII原创 2022-01-26 23:30:16 · 312 阅读 · 0 评论 -
AcWing 1996. 打乱字母(贪心+二分)
题目链接https://www.acwing.com/problem/content/1998/思路我们开四个string数组,然后前两个分别存储的是升序字符串序列和降序字符串序列,然后第三四个同理,然后对前两个进行sort排序,排完序后我们根据之前的c、d数组对a、b数组进行二分搜索,当然可以直接使用lowerbound或者upperbound,当然也可以自己手写,我这里直接用的STL,详情请看代码代码#include<bits/stdc++.h>using namespace s原创 2022-01-26 23:28:33 · 228 阅读 · 0 评论 -
AcWing 2014. 岛(离散化+差分)
题目链接https://www.acwing.com/problem/content/2016/思路离散化后利用差分的性质,也就是相邻岛之间的高度差,详情请看代码注释代码#include<bits/stdc++.h>using namespace std;#define ll long long#define endl "\n"#define PII pair<int,int>#define mod 1000000009ll ksm(ll a,ll b) {原创 2022-01-26 23:24:57 · 300 阅读 · 0 评论 -
AcWing 2058. 笨拙的手指(暴力枚举)
题目链接https://www.acwing.com/problem/content/2060/思路因为二进制和三进制有一位是错误的,那么我们直接二重循环枚举每一位,看更改后是否满足相等,如果是的话那么这就是答案,否则继续枚举代码#include<bits/stdc++.h>using namespace std;#define ll long long#define endl "\n"ll ans;bool fg(string a,string b) { int原创 2022-01-25 20:43:37 · 258 阅读 · 0 评论 -
AcWing 2060. 奶牛选美(DFS)
题目链接https://www.acwing.com/problem/content/2062/思路先DFS染色,将这两部分分开,分别用1和2标记,然后对于第一堆的每个元素直接用BFS跑一个最短路即可代码#include<bits/stdc++.h>using namespace std;#define endl "\n"const int N = 100;char mp[N][N];int a[N][N];int n,m;int dx[4]={-1,1,0,0};原创 2022-01-25 20:48:09 · 337 阅读 · 0 评论 -
AcWing 2041. 干草堆(差分)
题目链接https://www.acwing.com/problem/content/2043/思路因为我们前面有k个区间修改操作,最后求出中位数,由于是静态的,所以我们直接使用差分维护就好啦,然后最后求一个前缀和恢复一下修改后的每个位置的值即可代码#include<bits/stdc++.h>using namespace std;const int N = 1e6+10;int a[N];int n;int k,A,B;int main(){ cin>原创 2022-01-25 20:46:46 · 269 阅读 · 0 评论 -
AcWing 839. 模拟堆
题目链接https://www.acwing.com/problem/content/841/思路纯纯模拟堆的操作,后面细说,可以先看代码代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int原创 2022-01-24 23:06:32 · 233 阅读 · 0 评论 -
AcWing 240. 食物链
题目连接https://www.acwing.com/problem/content/description/242/思路1通过带权并查集来解决这个问题,我们构建一个这样的关系,我们对链的长度mod 3如果是0那么我们假定是A类说明和根节点是同类,可以吃C类如果是1那么我们假定是B类说明可以吃根节点也就是A类如果是2那么我们假定是C类,说明可以吃B类这样我们就根据链的深度对三类做了一个划分,那么我们想做的关系判断也就不难了,详情请看代码思路2通过种类并查集解决这个问题代码#incl原创 2022-01-24 23:03:29 · 152 阅读 · 0 评论 -
AcWing 837. 连通块中点的数量
题目连接https://www.acwing.com/problem/content/839/思路因为有集合关系,所以我们考虑用并查集来维护,此题对于和并和查询是否在一个集合维护比较简单,对于一个集合内的元素个数,我们可以初始化一个集合元素个数,都是1,然后每次合并的时候判断是否有两个不同集合合并,如果有的话,就把我们当作祖先集合的元素个数更新(也就是加上另外一个集合的元素个数)代码#include<bits/stdc++.h>using namespace std;//-----原创 2022-01-24 23:01:53 · 160 阅读 · 0 评论 -
AcWing 836. 合并集合
题目连接https://www.acwing.com/problem/content/838/思路并查集模板题当操作是合并时,先判断两者是否在一个集合,然后合并(其实不用判断也可以,反正都是一个集合的)当操作是查询时,我们直接判断两者是否在一个集合里面就好了代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#def原创 2022-01-24 22:47:15 · 196 阅读 · 0 评论 -
AcWing 143. 最大异或对
题目连接https://www.acwing.com/problem/content/145/思路贪心的想,如果我们想找到一个异或的最大值,那么我们肯定想每一位最好都是相反的,如果没有这样的情况那么就只能走相同的一边,最后贪出来的就是最优解。代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000原创 2022-01-24 22:46:28 · 234 阅读 · 0 评论 -
AcWing 835. Trie字符串统计
题目连接https://www.acwing.com/problem/content/submission/837/思路我们通过trie树的结构将我们要插入的字符串插进去,但是要注意一点,最后我们要统计一下插入的字符串的个数,然后查找的时候同理,这个结构相当于每一层有26个字符代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long lon原创 2022-01-24 22:45:17 · 227 阅读 · 0 评论 -
AcWing 154. 滑动窗口
题目连接https://www.acwing.com/problem/content/description/156/思路和单调栈类似的思路,只不过我们现在维护的是一个双端队列,可以直接使用STL的dequeue但是数组模拟可能会更加的快速,而且数组模拟更能体会到单调队列的思想吧,如果我们相维护的是一个单调递增的队列,如果在一个数x的右边存在一个比x还小的数,那么x这个数就永远不会在之后输出了,因为我们取得是区间最小值,所以我们就吧x出队,当然不在区间范围内得数我们也要出队,然后我们就能得到一个单调的原创 2022-01-24 22:23:14 · 259 阅读 · 0 评论 -
AcWing 830. 单调栈
题目连接https://www.acwing.com/problem/content/832/思路我们维护一个严格单调递增的序列,我们考虑这样一个问题,如果有一个比x还小的值,而且还在x右边,那么x就永远用不到了,因为我们要取得是左边最小得一个值,所以维护一个严格单调递增的序列即可,自然而然想到单调栈代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define原创 2022-01-24 22:21:25 · 162 阅读 · 0 评论 -
AcWing 829. 模拟队列
题目连接https://www.acwing.com/problem/content/831/思路我们定义一个head和tail表示头尾指针,然后push的时候就把tail指针往后移动,pop的时候就把head指针往前移动,当两指针相等的时候说明队列里面没有元素,head指针指向的就是我们的队首元素代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define原创 2022-01-24 22:19:47 · 141 阅读 · 0 评论 -
AcWing 3302. 表达式求值
题目连接https://www.acwing.com/problem/content/3305/思路我们用一个map记录不同符号的一个优先级,然后用两个栈分别记录数字和操作符,如果当前的符号是右括号,那么我们就得强制处理到左括号去,如果当前读到的是一个数字,那么我们直接把数字放入数字栈里面就好了,如果当前读到的是一个运算符,那么我们就得先处理栈中优先级大于等于当前运算符的一些运算,最后将当前的运算符加入到栈中,那么这个栈就一个运算符单调递增的一个栈,详情请看代码代码#include<bits原创 2022-01-23 22:19:34 · 176 阅读 · 0 评论 -
AcWing 828. 模拟栈
题目连接https://www.acwing.com/problem/content/830/思路我们直接开一个a数组,然后用一个整数top表示栈顶,0的时候表示为栈空,然后不断模拟就好啦#include<bits/stdc++.h>using namespace std;//----------------自定义部分----------------#define ll long long#define mod 1000000009#define endl "\n"#defi原创 2022-01-23 22:18:37 · 154 阅读 · 0 评论 -
高精度运算
高精度加法两个大数的高精度加法:模板题题目连接:https://www.acwing.com/problem/content/793/代码vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int i原创 2022-01-23 22:10:33 · 650 阅读 · 0 评论 -
蓝桥每日真题之时间显示
题目来源2021年蓝桥杯省赛第一场F题题目链接:http://acm.mangata.ltd/p/P1488考点暴力、小技巧视频讲解视频连接:思路因为给出的是一个毫秒值,那么我们要将其转化为秒、分钟、小时,注意的是1s=1000ms,其余的进制都是60,别记错了!,关于补0显示:%02d这样的话如果不满两位数,会自动补上的代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分--------原创 2022-01-23 17:35:25 · 349 阅读 · 0 评论 -
蓝桥每日真题之123
题目来源2021年蓝桥杯国赛F题题目链接:http://acm.mangata.ltd/p/P1505考点前缀和、初中数学视频讲解思路我们可以怎么考虑这个事情呢,我们会发现这个序列就是数量不断上升的一个等差数列,我们只需要预处理出每一段长度的一个和,然后我们求一个区间到[0,R]的一个和,因为我们与处理过,所以这个O(1)就能得出,然后再求一下[0,L-1]的一个区间和,那么我们相减就是我们所需要的答案了,注意的是这里的L和R不一定刚好都是完整区间,所以我们还得处理一下边角的情况,关于前缀和的原创 2022-01-22 17:12:15 · 729 阅读 · 0 评论 -
蓝桥每日真题之完全日期
题目来源2021年蓝桥杯国赛C题题目链接:http://acm.mangata.ltd/p/P1504考点暴力枚举,常识or手数视频讲解视频连接:思路思路一因为从2001年1月1日到2021年12月31日也就二十年,我们直接打开日历手动计数就好啦,肥肠的方便!思路二我们可以通过计算机辅助我们计算,我们开三重循环,分别模拟year、month、day,然后把每一天都拿来计算就好啦,然后要注意的是闰年的2月是29天,不过好在没有这一天是一个完全平方数。代码#include<bit原创 2022-01-21 17:12:45 · 6818 阅读 · 0 评论 -
蓝桥每日真题之小平方
题目来源2021年蓝桥省赛第二场G题题目链接:http://acm.mangata.ltd/p/P1164考点暴力枚举视频讲解视频连接:思路我们只需要从1枚举到n-1,你然后在枚举的过程中计算一下当前位置的平方,然后再对n取模,如果余数是小于n的一半那么我们就记录下来,否则我们就不记录,最后输出我们记录的个数即可代码#include<bits/stdc++.h>using namespace std;//----------------自定义部分-------------原创 2022-01-20 22:35:44 · 773 阅读 · 0 评论 -
AcWing 826. 单链表
题目连接https://www.acwing.com/problem/content/828/思路有点类似链式前向星建图,不同的是链式前向星是多链表的形式,这个只是单链表,我们的头节点标记为-1,每次插入的时候将当前的指针指向后面的元素,然后将前面的指针指向当前即可完成插入操作,注意这里的节点是从0开始计算的,关于删除操作,我们需要注意删除头节点的时候直接让head指向head的下一个位置即可#include<bits/stdc++.h>using namespace std;#de原创 2022-01-20 15:29:28 · 365 阅读 · 0 评论 -
AcWing 789. 数的范围
题目链接https://www.acwing.com/problem/content/791/思路写一个划分x为左边界和有边界的整数二分方法即可#include<bits/stdc++.h>using namespace std;#define ll long long#define mod 1000000009#define endl "\n"#define PII pair<int,int>ll ksm(ll a,ll b) { ll ans = 1; f原创 2022-01-19 21:44:56 · 293 阅读 · 0 评论