
算法
文章平均质量分 61
蒟蒻一枚
qwq
展开
-
蒟蒻君的数学学习之路2——质数相关算法
⭐前言若ppp为质数,则:p∈Np \in Np∈N且p>1p>1p>1;pmod ∀i∈[2,p−1]≠0p \mod \forall i \in [2,p-1] \neq 0pmod∀i∈[2,p−1]=0。即ppp为>1>1>1的整数且ppp有且仅有111和ppp两个因数。今天,蒟蒻君将和大家一起学习质数相关算法。文章目录⭐前言⭐一、质数判定????1.1n1.1 \sqrt n1.1n试除????思路????代码????1.21.21.2原创 2021-11-29 22:01:33 · 2547 阅读 · 10 评论 -
蒟蒻君的数学学习之路1:斐波那契数列的n种解法
文章目录前言一、 递推1.1 思路1.2 优化:滚动数组1.3 效率分析1.4 代码二、递归2.1 思路2.2 效率分析2.3 代码三、矩阵快速幂3.1 数学知识:矩阵与矩阵快速幂3.2 思路3.3 效率分析3.4 代码四、通项公式4.1 公式及证明:待定系数法4.2 效率分析4.3 代码五、算法比较前言一、 递推1.1 思路1.2 优化:滚动数组1.3 效率分析1.4 代码二、递归2.1 思路2.2 效率分析2.3 代码三、矩阵快速幂3.1 数学知识:矩阵与矩阵快速幂3.2 思路原创 2021-11-16 21:21:16 · 1115 阅读 · 17 评论 -
CSPJ2021考完了,你,AK了吗?
CSPJ2021题解,抱歉最近时间紧停更了一个月,你们最喜欢的蒟蒻君回来啦~原创 2021-10-31 14:44:11 · 1291 阅读 · 26 评论 -
手撕STL(2)——队列的内部实现
文章目录前言代码(链表存储)前言队列小伙伴们一定不陌生,本节课蒟蒻君来带大家学习队列的内部实现。代码(链表存储)#include <bits/stdc++.h>using namespace std;// 定义链表 template<class T>struct node { T num; node<T>* nxt;};template<class T>class MyQueue { private: .原创 2021-09-11 11:57:46 · 867 阅读 · 27 评论 -
手撕STL(1)——栈的内部实现
文章目录前言代码(详见注释)前言蒟蒻君开始写STL了…代码(详见注释)#include <bits/stdc++.h>#include <cstddef>using namespace std;// 定义链表template <class T>struct node { T num; node<T>* nxt;};template<class T>class MyStack { private: .原创 2021-09-11 09:50:34 · 381 阅读 · 0 评论 -
NOIP2014提高组Day1T1(生活大爆炸版石头剪刀布)题解
文章目录题目信息解题思路法1:纯模拟(T(n) + O(n))法2:数学优化(T(min{n, na * nb / GCD(na, nb)}) + O(n))代码实现法1法2题目信息题目传送门解题思路法1:纯模拟(T(n) + O(n))模拟n比赛,用两个变量记录两个人出到周期的第几位了,然后判断谁能赢。法2:数学优化(T(min{n, na * nb / GCD(na, nb)}) + O(n))若n ≤ na * nb,即小A和小B已经重新回到na1对nb1了,那么直接按照法1模拟一.原创 2021-09-04 21:40:48 · 427 阅读 · 6 评论 -
NOIP2014普及组T3(螺旋矩阵)题解
文章目录题目信息解题思路法1:模拟(T(n^2^) + O(n^2^))+ 50pts法2:数学(T(1) + O(1)) + 100pts代码实现法1法2题目信息题目传送门解题思路法1:模拟(T(n2) + O(n2))+ 50pts直接用螺旋矩阵的排列方式模拟,一直右下左上。但是…TLE+MLE啊QWQ。法2:数学(T(1) + O(1)) + 100pts细心的小伙伴会发现,我们只需要查询矩阵中的第一个数,也就是说不需要构造出矩阵中所有数。我们可以找到(x, y)在第几圈,然.原创 2021-09-04 17:18:24 · 592 阅读 · 3 评论 -
算法初探系列14——线性DP进阶之最大子段和与最长上升子序列
文章目录概述问题题目描述输入格式输出格式输入输出样例说明/提示数据规模与约定分析法1:枚举(T(n^3^) + O(1))法2:枚举+前缀和优化(T(n^3^) + O(1))法3:DP(T(n) + O(n))法4:DP + 前缀和优化(T(n) + O(1))法5(拓展):分治法(T(n) + O(n))实现法1法2法3法4法5概述上节课蒟蒻君和大家一起学习了线性DP初步,相信聪明伶俐的你已经很熟悉啦~这节课蒟蒻君带领大家解决线性DP的一个经典问题。问题题目描述给出一个长度为 n 的序原创 2021-08-27 22:02:32 · 1152 阅读 · 15 评论 -
算法初探系列13——线性DP初步
文章目录概述基本思想术语使用条件实现步骤题目1:蒟蒻君逛超市概述上节课我们学习了递推(新手建议看),这节课我们来学习和递推很类似的动态规划,即DP。基本思想问题的答案可以通过子问题的答案推出。让我们先回顾一下递归的基本思想:例如问题的参数为(10,11),我们可以将他化解为几个子问题,这几个子问题再继续化解,直到所有子问题都是有解的,在自底向上累加。动态规划其实就是记忆化搜索(不会的小伙伴可以忽略),每次将子问题的解存到一个表里,以后需要直接调用就可以,不用每次都继续向下分。目前,我们可以暂原创 2021-08-27 18:05:02 · 575 阅读 · 5 评论 -
算法初探系列12——递推
文章目录概述代入问题1:爬楼梯问题2:平面分割一、递推概念题目1:斐波那契题目2:错排概述大家好,我是颜值与才华并存的蒟蒻君~这节课,蒟蒻君将和大家一起学习最简单的动态规划——线性DP初步。代入问题1:爬楼梯共有n级台阶,蒟蒻君站在第0级的位置,每次能上1或2级台阶。请问,蒟蒻君走到第n级台阶有多少种走法?问题2:平面分割在一个平面上画n条直线,最多能将平面分割成多少部分?一、递推概念大家通过仔细观察后会发现,以上两道题都可以用找规律的方法解决。我们定义dpi为n = i时的答案,则:原创 2021-08-27 09:09:15 · 566 阅读 · 2 评论 -
NOIP2002普及组T2(过河卒)题解
文章目录题目信息解题思路法1:dfs(60pts)法2:dp(正解)代码实现法1法2题目信息题目传送门解题思路法1:dfs(60pts)先算出所有“马的控制点”,然后用深度优先搜索尝试每一条不途径这些点的路径。不熟悉dfs请点这里,这里和这里。法2:dp(正解)定义dpij为从起点走到(i, j)的总方案数。每个点可以从左边或者上边走过来,即dpij = dpi-1j + dpij-1马和马的控制点不能走,即这些地方的dp为0。不熟悉dp请点这里(链接暂空)代码实现法1#i原创 2021-08-26 20:33:13 · 529 阅读 · 1 评论 -
错题集7——池塘里的鱼
文章目录题目信息解题思路算法1(对于前40%数据):DP+滚动数组优化算法2(对于后60%数据):状压DP代码实现题目信息解题思路算法1(对于前40%数据):DP+滚动数组优化**状态定义** dpi为还剩i条鱼时第一条鱼的存活概率。滚动数组:时间复杂度: O(nlogn232)算法2(对于后60%数据):状压DP**状态定义:** dpk为到达状态k的概率。状态转移:tips: 上述popcnt为库函数 __builtin_popcount,求一个数的二进制表示中有多少原创 2021-08-25 17:34:00 · 434 阅读 · 3 评论 -
错题集6——听君一席话,如听一席话
文章目录题目信息解题思路代码实现题目信息解题思路O(n)递推算出每个字符串的长度,判断k是否合法。利用长度找规律,O(n)时间求出答案。代码实现#include <bits/stdc++.h>using namespace std;typedef long long ll;const string s1 = " words"; // size = 5const string s2 = " Listeningtoyour"; // size = 15const stri原创 2021-08-25 14:46:44 · 1045 阅读 · 3 评论 -
NOIP2014普及组T2(比例简化)题解
文章目录题目信息解题思路:模拟代码实现题目信息题目传送门解题思路:模拟对于一个比例x : y:若(x : y) < (a : b),则x加1,分母相同的情况下最小幅度的增加分数大小;若(x : y) > (a : b),则y加1,分字相同的情况下最小幅度的减小分数大小。注意:有的时候浮点数精确度不够(double双精度是四舍五入至小数点后6位),那么就需要交叉相乘比较,即(x : y) < (a : b)等价于xb < ya。加速(常数级优化)如果x和y不互质原创 2021-08-24 22:01:08 · 1017 阅读 · 0 评论 -
NOIP2014普及组T1(珠心算测验)题解
文章目录题目信息解题思路:哈希+二层枚举代码实现题目信息题目传送门解题思路:哈希+二层枚举用数组b记录一个数是否可以被得出。判断b中有多少个数和a中的数相同。代码实现#include <bits/stdc++.h>using namespace std;int a[105];bool b[20005];int main() { int n, sum = 0; cin >> n; for (int i = 1; i <= n; ++i) { c原创 2021-08-24 21:51:08 · 1422 阅读 · 0 评论 -
历年NOIP/CSP题解(持续更新)
文章目录2020年NOIPCSPJCSPS2019年CSPJCSPS2018年NOIP普及组NOIP提高组2017年NOIP普及组NOIP提高组2016年NOIP普及组NOIP提高组2015年NOIP普及组2020年NOIPNOIP2020T1题解NOIP2020T2题解NOIP2020T3题解NOIP2020T4题解:暂无CSPJCSP-J2020第一题(优秀的拆分)题解CSP-J2020第二题(直播获奖)题解CSP-J2020第三题(表达式)题解CSP-J2020第四题(方格取数)原创 2021-08-20 21:16:51 · 2501 阅读 · 21 评论 -
NOIP2015提高组Day2T2(子串)题解
文章目录题目信息解题思路法1:三维dp(no优化,70pts&MLE)法2:法1+滚动数组优化(80pts,TLE)法3:法2+前缀和优化(AC!!)代码实现法1法2法3题目信息题目传送门解题思路法1:三维dp(no优化,70pts&MLE)状态定义定义dpkij为从a的前i个字符中取k个互不重叠的非空子串, 填充b的方案数。边界条件∀dpi00 = 1状态转移 对于每次转移,有以下两种情况(答案为两者之和):条件方案数不使用aidpki-1j原创 2021-08-24 19:28:53 · 420 阅读 · 4 评论 -
NOIP2015提高组Day2T1(跳石头)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路我们可以发现,移走地越多,就越有可能符合要求,即问题符合单调性,可使用二分答案。这样,每次选定一个mid判断去掉mid个shi代码实现...原创 2021-08-24 12:39:19 · 530 阅读 · 2 评论 -
NOIP2015提高组Day1T2(信息传递)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路把每个人看成一个点,信息传递就是边,轮数就是最小环。A传递给B信息,就从A连一条指向B的边,同时更新A的父节点。A到父节点的路径长度 = B到父节点的路径长度 + 1如果两个点A和B的祖先相同,可构成环。长度 = A到父节点的路径长度 + B到父节点的路径长度 + 1代码实现#include <bits/stdc++.h>using namespace std;const int N = 200005;int原创 2021-08-22 21:33:02 · 564 阅读 · 1 评论 -
NOIP2015提高组Day1T1(神奇的幻方)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路按照题面上的方法直接模拟。代码实现#include <bits/stdc++.h>using namespace std;int a[40][40];int n;int main() { cin >> n; int x = 1, y = n / 2 + 1; for (int i = 1; i <= n * n; ++i) { a[x][y] = i;原创 2021-08-21 20:33:27 · 298 阅读 · 0 评论 -
NOIP2015普及组T4(推销员)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路想让答案最大,对于每个x,一定选择最大的s和前x - 1大的a或者前x个最大的a。用sum数组记录a的前缀和,bi记录a数组前i项的最大值,c[i]记录表达式a[i] * 2 + s[i]后i项的最大值。答案 = max(sum[x] + 2 * b[x], sum[x - 1] + c[x])不太熟悉前缀和的童鞋请移步这里。代码实现#include <bits/stdc++.h>using namespace s原创 2021-08-21 20:33:07 · 777 阅读 · 0 评论 -
NOIP2015普及组T3(求和)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路根据y - x = z - y,可得x + z = 2y,即x与z奇偶性相同。所以,奇数和偶数可以分开处理所有颜色。分开后就很好发现:任意两个相同颜色的两个点都可以产生这种三元组。分解多项式:(x1 + x3) * (numberx[1] + numberx[3]) + (x2 + x3) * (numberx[2] + numberx[3])= (x1 + x2) * numberx[3] + (numberx[1] + num原创 2021-08-21 20:32:24 · 699 阅读 · 0 评论 -
NOIP2015普及组T1(金币)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路直接模拟。代码实现#include <bits/stdc++.h>using namespace std;int main() { int k; cin >> k; // pre: 目前每天能获得多少金币 // sum: 目前共有多少金币 int pre = 1, sum = 0; // 每次循环模拟n天,每天获得n个金币 for (; k - pre &原创 2021-08-20 19:33:04 · 760 阅读 · 0 评论 -
NOIP2015普及组T2(扫雷游戏)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路对于每个雷,直接输出即可。对于每个问号,看看周围8个点有多少个雷即可。代码实现#include<bits/stdc++.h>using namespace std;// a[i][j]表示地图第n行m列是否有雷bool a[105][105];int main() { int n, m; cin >> n >> m; for (int i = 1; i <=原创 2021-08-20 19:32:15 · 1685 阅读 · 1 评论 -
NOIP2016提高组Day2T1(组合数问题)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路组合数其实可以看成杨辉三角,Cij就是第i行第j列。状态转移方程:Cij = (Ci-1j + Cij-1) % k优化:前缀和(预处理O(n2),查询O(1))不太熟悉前缀和的童鞋请移步there代码实现#include <bits/stdc++.h>using namespace std;const int N = 2e3 + 5;int t, k, n, m;int c[N][N], s[N][N];原创 2021-08-20 19:15:38 · 326 阅读 · 0 评论 -
NOIP2016提高组Day1T1(玩具谜题)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路移动方向只取决于两个因素:面朝方向和向左还是右走。通过数组模拟,大于n则%=n(转了一圈还是起点),小于0要 += n(至少要走到起点后)。代码实现#include <bits/stdc++.h> using namespace std;const int N = 1e5 + 5;bool dir[N];string name[N]; int main() { int n, m; cin >>原创 2021-08-19 21:13:01 · 298 阅读 · 0 评论 -
算法初探系列11——栈
文章目录概述队列是哈?这东东咋用?使用实例练习概述栈是C++中很常用的一种STL,本节课蒟蒻君将带领大家学习栈。队列是哈?栈是一种操作受限制的线性表,只允许从前端插入,前端删除。我们管栈的前端叫栈顶,后端叫栈底。插入元素叫入栈,删除元素叫出栈。我们可以把栈想象成交作业,并且只能放在一堆作业本的最上面,发作业的时候从上往下发。也就是说先交作业的人会后收到作业,后交作业的人会先收到作业。栈其实差不多就是这样:这东东咋用?函数名功能参数类型返回值类型push将一原创 2021-08-19 20:15:34 · 252 阅读 · 0 评论 -
NOIP2013提高组华容道题解
文章目录题目信息解题思路代码实现(有错待改,注释待加)题目信息题目传送门解题思路在这道题中,我们肯定会想到用bfs找最短路的想法。但是,并不是所有棋子的状态都是需要记录哒(这样就会TMLE得更多啦)。在棋子移动的过程中,除了和目标棋子换的时候,空的位置已知可以和别的棋子换,所以我们只需要记录空的位置和目标棋子的位置就ok啦。代码实现(有错待改,注释待加)#include <bits/stdc++.h>using namespace std;const int N = 30;co原创 2021-08-18 22:08:45 · 347 阅读 · 0 评论 -
NOIP2016普及组T4(魔法阵)题解
题目信息题目传送门解题思路在此图中,A表示xa,B表示xb,C表示xc,D表示xd,那么这四个点就能组成一个魔法阵。令k = xd - xc。根据题目条件可得:xb - xa = 2kxc - xb > 6k综上,可求出:1 ≤ k ≤ n / 9所以我们可以枚举k和d的位置,这样就可以确定C和D的值了。定义sumi为第i中方案数(算完了记录后马上改变),那么:sumd = suma * sumb * sumcsumc = suma * sumb * sumd同理原创 2021-08-18 22:05:05 · 1006 阅读 · 0 评论 -
洛谷P1363幻象迷宫题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路在这里可怜喵星人一秒钟,然后我们开始讲题…这道题明显是用搜索的 ,题目里的迷宫很容易让人想到dfs。显然,我们可以把输入的一个迷宫变成九个迷宫,判断从起点(x, y)能否走到(x + n, y),(x - n, y),(x, y + m)或(x, y - m)。但是大家会发现,这样的空间复杂度是很大哒,明显会MLE。所以我们直接对迷宫去mod就好啦。但是,如果走到过一个点又走到了这个点,那是可以走∞远的。这里又出现了一大大大大大原创 2021-08-18 21:07:49 · 651 阅读 · 0 评论 -
NOIP2016普及组T3(海港)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路用队列存储时间。用cnt数组存储每个国籍有多少人。每次输入时判断:若没有这个国籍的人,就新建一个国籍。如果第一个人到达的时间比当前时间晚,就跳到下一个人。把这个人删掉。如果这个人是他的国籍的唯一一个人,则删除这个国籍。重复前两部操作,直到第一个人到达的时间小于等于当前时间。代码实现#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 5原创 2021-08-18 17:17:37 · 677 阅读 · 0 评论 -
算法初探系列10——队列
文章目录概述队列是哈?这东东咋用?使用实例练习概述队列是C++中很常用的一种STL,本节课蒟蒻君将带领大家学习队列。队列是哈?队列是一种操作受限制的线性表,只允许从前端删除,后端插入。我们管队列前端叫队首,后端叫队尾。队列插入元素叫入队,删除元素叫出队。我们可以把队列想象成一个等着撸猫的队伍,先来的先撸猫,后来的后撸猫,不能插队。这就是队列的基本性质——先进先出。队列其实差不多就是这样:这东东咋用?函数名功能参数类型返回值类型push将一个元素入队和队列原创 2021-08-18 13:46:36 · 223 阅读 · 0 评论 -
算法初探系列9——浅谈指针
文章目录概述指针是个神马东东?如何定义指针?如何使用指针?如何用变量得到指针/用指针得到变量如何改变变量/指针的值概述在C/C++中,指针一直被人们视为BOSS,本节课蒟蒻君将和大家一起学习指针的基本使用方法。指针是个神马东东?指针是指向另外一个东东的符合类型(其实不用去管ta是个神马东东),就是一个地址,可以用它间接地访问其他元素。如何定义指针?int *p;其中的 ‘*’ 表示p是一个指针。我们管p叫int *,即指向int类型变量的指针。此时的p没有被初始化,被称为野指针 ,也就原创 2021-08-18 10:10:47 · 282 阅读 · 1 评论 -
NOIP2016普及组T2(回文日期)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路枚举月和日,判断后四位翻转过来的八位数是否合法即可。tips:二月不用特殊处理,因为0229翻转过来的9220是闰年。代码实现#include <bits/stdc++.h> using namespace std;int day[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};int main() { int n, m, res = 0;原创 2021-08-17 13:01:58 · 864 阅读 · 0 评论 -
NOIP2016普及组T1(买铅笔)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路求出三种价格取最小,无坑。代码实现#include <bits/stdc++.h>using namespace std;int main() { int n, res = 1e9; cin >> n; for (int i = 0; i < 3; ++i) { int x, y; cin >> x >> y;原创 2021-08-17 12:50:13 · 811 阅读 · 0 评论 -
算法初探系列8——字符数组与字符串
文章目录概述字符数组创建使用(常用函数)实例练习:洛谷P1015回文串字符串创建使用(常用函数)实例练习:洛谷P1032字串变换概述字符串是编程中很重要的一种变量类型,除了整数或浮点数之外,其余的都属于字符串。这节课蒟蒻君就来为大家详解字符数组与字符串。字符数组创建字符数组可以一个一个字符地创建,也可以直接用字符串的形式。注意: 字符数组的最后一位是’\0’,所以长度要比定义的多一位。#include <bits/stdc++.h>using namespace std;//原创 2021-08-17 11:26:46 · 220 阅读 · 1 评论 -
洛谷P1032字串变换题解
文章目录题目信息解题思路:BFS代码实现题目信息题目传送门解题思路:BFS每次字符串入队找可以执行的操作(看一下有没有可以修改的串)。修改后入队,记录修改次数。tips:每次找处理完后要继续找这个字符串后是否有可以修改的子串。代码实现#include <bits/stdc++.h>using namespace std;string a, b;string A[7], B[7];struct node { // 当前字符串 string pre;原创 2021-08-17 11:25:56 · 186 阅读 · 0 评论 -
洛谷P1015回文串题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路直接暴力模拟。代码实现#include <bits/stdc++.h>using namespace std;char s[2005];int n;vector<int> a, b;int main() { cin >> n >> s; for (int i = 0; i < strlen(s); ++i) { if (s[i] >= '原创 2021-08-17 11:15:07 · 237 阅读 · 0 评论 -
NOIP2017提高组Day2T1(奶酪)题解
文章目录题目信息解题思路代码实现题目信息题目传送门解题思路找出一个处于奶酪下表面的点,枚举相邻点找到合法状态后再dfs一遍就ok了代码实现#include <bits/stdc++.h>using namespace std;const int N = 1005;struct pos { double x, y, z;} p[N];long long t, n, r, h;bool a[N], f;// 求两点是否相邻inline bool dis(pos a原创 2021-08-16 22:00:19 · 352 阅读 · 1 评论 -
NOIP2017提高组Day1T2(时间复杂度)题解
文章目录题目信息解题思路题目分析代码实现题目信息题目传送门解题思路题目分析一层循环可能:不会执行(执行0次)执行常数次执行n次错误的原因有:变量重名F与E匹配失败代码实现...原创 2021-08-16 21:46:58 · 272 阅读 · 0 评论