![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
算法合集
青云遮夜雨
这个作者很懒,什么都没留下…
展开
-
P3811 【模板】乘法逆元
#include <bits/stdc++.h>#define ll long longusing namespace std;int n, p;int inv[1000010];int exgcd(int a, int b, int &x, int &y)//拓展欧几里得{ if (b == 0) { x = 1; y = 0; return a; } int r = exgcd(b,原创 2021-11-03 14:09:15 · 101 阅读 · 0 评论 -
P4549 【模板】裴蜀定理 题解
裴蜀定理若gcd(a,b)|c成立,则存在x,y使得ax+by=c成立此题为裴蜀定理的推广,当存在多个变量时仍然成立若gcd(a1,a2,a3,a4,…)|c时,存在x的序列使得a1x1+a2x2+a3x3+…=c成立此题让我们求c的最小值,很明显c的最小值为a序列的最小公约数注意:当a为负数时,让它变为整数再取gcd#include<bits/stdc++.h>using namespace std;int n;int gcd(int a,int b){ retu原创 2021-11-03 13:37:55 · 338 阅读 · 0 评论 -
2020年第十一届C/C++ A组第二场蓝桥杯省赛真题
目录第一题:门牌制作第二题:既约分数第三题:蛇形填数第四题:7段码第五题:平面分割第六题:成绩统计第七题:回文日期第八题:子串分值第九题:荒岛探测第十题:字串排序第一题:门牌制作#include<iostream>using namespace std;int sum(int n){ int ans = 0; while (n) { if (n % 10 == 2) ans++; n /= 10; } return ans;}int main(){ in原创 2021-04-18 13:36:20 · 241 阅读 · 0 评论 -
蓝桥杯——兰顿蚂蚁
此题为一个简单模拟代码如下:#include<iostream>using namespace std;int main(){ int m, n, map[105][105], i, j, x, y, k; char s; cin >> m >> n; for (i = 0; i < m; i++) for (j = 0; j < n; j++) cin >> map原创 2021-03-24 01:08:30 · 80 阅读 · 0 评论 -
快速排序
#include<iostream>using namespace std;int n,a[1000001];void qsort(int l,int r)//应用二分思想{ int mid=a[(l+r)/2];//中间数 int i=l,j=r; do{ while(a[i]<mid) i++;//查找左半部分比中间数大的数 while(a[j]>mid) j--;//查找右半部分比中间数小的数 if原创 2021-05-01 19:58:02 · 45 阅读 · 0 评论 -
快速幂&矩阵快速幂
快速幂什么是快速幂呢?试想,如果你想计算a^b,你该怎么做呢?我们只需b个a相乘即可,但是这么要计算b次,当幂值很大时,消耗时间也很大,那么有什么办法可以减少次数呢?这就要用到快速幂了快速幂采用分治的策略,一分为二, 二分为四,四分为八…a ^ b =( (a ^2) ^ (b/ 2) ) * a ^ (b % 2) = (a ^ (b/2))^ 2 * a ^ (b % 2)= ( a ^ (b/2) * a ^ (b /2) ) * a ^ (b % 2) … 接着不断的分治比如计算2^原创 2021-03-28 09:20:08 · 105 阅读 · 0 评论 -
2019年第十届C/C++ A组蓝桥杯省赛真题题解
这里写目录标题第一题:平方和第二题:数列求值第三题:最大降雨量第四题:迷宫第五题:RSA 解密第六题:完全二叉树的权值第七题:外卖店优先级第八题:修改数组第九题:糖果第十题:组合数问题第一题:平方和#include<iostream>using namespace std;int main(){ int sum = 0; long long num = 0; for (int i = 1; i <= 2019; i++) { int t = i; while(t原创 2021-04-15 09:00:02 · 447 阅读 · 0 评论 -
动态规划
动态规划1.什么是DP?定义01背包问题完全背包2.区间DP3.树形DP4.状压DP5.数位DP6.期望DP1.什么是DP?我们用一个例题来理解什么时动态规划三角形取数假如你在如下正整数三角形的最下方你每次可以向正上方或者左上方走一格,直达最上方求你经过的数字的最大和11 45 1 41 9 1 98 1 0 8 9思路:每个位置可由其右下方的位置和正下方的位置到达设你在i行j列时能取得数的最大值为f[i][j]发现f[i][j]=max(f[i+1][j],f[i+1][j+原创 2021-03-25 21:32:54 · 139 阅读 · 0 评论 -
最大子序列算法
O(N^3)O(N^2)O(N log N)原创 2021-07-15 12:34:57 · 365 阅读 · 0 评论 -
不用加减乘除做加法
class Solution {public: int add(int a, int b) { while(b!=0){ int tmp=a^b; b=((unsigned int)(a&b)<<1); a=tmp; } return a; }};原创 2021-09-03 09:56:24 · 48 阅读 · 0 评论 -
分治算法
分治算法分治,字面上的解释是“分而治之”,就是把一个复杂的问题分成许多相似或者相同的子问题,再把子问题分成更小的问题,直到最后子问题可以直接简单求解,原问题的解即子问题的解的合并。特征:1.问题的规模缩小到一定规模就可以很容易的解决2.问题可以分解成若干个规模较小的模式相同的子问题,即该问题具有最优子结构性质3.合并问题分解出的子问题的解可以得到问题的解4.问题所分解出的各个子问题之间是独立的,即子问题之间不存在公共的子问题分治问题的实例:归并排序代码如下:void msort(int原创 2021-03-09 19:54:38 · 131 阅读 · 0 评论 -
搜索算法——剪枝
剪枝算法定义:在进行搜索算法的过程中,将已知无意义的情况排除的行为叫做剪枝操作方法:剪枝比较灵活,需要具体问题具体分析有些是比较明显的,比如题目中的限制条件,有的则是需要分析得到的剪枝可以分为(1)可行性剪枝(2)最优性剪枝我们从例题分析:洛谷P1535最直接的思路:直接开始深搜,但要注意以下几点:限制搜索深度时间为t可以重复经过一个地方必须在规定的时间到达终点但是这样会TLE,所以我们需要剪枝容易发现,从点(x1,y1)到(x2,y2)最少需要abs(x1-x2)+ab原创 2021-03-20 19:47:27 · 1768 阅读 · 0 评论 -
蓝桥杯——今有7对数字
题目:今有7对数字:两个1,两个2,两个3,…两个7,把它们排成一行。要求:两个1间有1个其它数字,两个2间有2个其它数字,以此类推,两个7之间有7个其它数字。如下就是一个符合要求的排列:17126425374635。当然,如果把它倒过来,也是符合要求的。请你找出另一种符合要求的排列法,并且这个排列法是以74开头的。注意:只填写这个14位的整数,不能填写任何多余的内容,比如说明注释等思路:DFS代码#include<iostream>using namespace std;i原创 2021-03-19 19:40:30 · 246 阅读 · 0 评论 -
洛谷p1135——奇怪的电梯
算法:BFS思路:我们把此电梯问题看作是一张图,从一个楼层到另一个楼层看作一条路,此题便可以转化成搜索一张图,求最短路,注意一点,如果起点和目的地一样的话,直接输出0代码:#include<iostream>#include<cstdio>using namespace std;int a, b;int n;int q[201];int dep[201];int vis[201];int ans = 0;int num[205];void bfs(int.原创 2021-03-19 19:04:50 · 262 阅读 · 0 评论 -
OpenJudge 1818:红与黑
思路:1.首先我们先找到起点2.以起点为初始结点开始搜索3.以上下左右的顺序寻找未被访问过的黑色结点3.移动到下一个结点并打上标记,代表这个结点已经被访问过了4.如果这个当前结点周围都被访问过了,返回上一结点5.重复直至栈空代码int m, n, counter = 1;int mx[4] = { 0,1,0,-1 };int my[4] = { 1,0,-1,0 };bool nmap[30][30];int a,b;void dfs(int x, int y){ for .原创 2021-03-18 20:29:22 · 91 阅读 · 0 评论 -
洛谷P2240 【深基12.例1】部分背包问题
阿里巴巴走进了装满宝藏的藏宝洞。藏宝洞里面有 N堆金币,第 i 堆金币的总重量和总价值分别是m[i]和v[i], 阿里巴巴有一个承重量为 T 的背包,但并不一定有办法将全部的金币都装进去。他想装走尽可能多价值的金币。所有金币都可以随意分割,分割完的金币重量价值比(也就是单位价格)不变。请问阿里巴巴最多可以拿走多少价值的金币?思路:这是一道典型的贪心题,贪心策略是每次装金币的时候尽量装单位质量价值最高的金币(即有最大的性价比)#include<iostream>using namespa.原创 2021-03-12 09:01:24 · 251 阅读 · 0 评论 -
蓝桥杯——数独游戏
玩家需要根据9×9盘面上的已知数字,推理出所有剩余空格的数字,并满足每一行、每一列、每一个同色九宫内的数字均含1-9,不重复。数独的答案都是唯一的,所以,多个解也称为无解。本图的数字据说是芬兰数学家花了3个月的时间设计出来的较难的题目。但对会使用计算机编程的你来说,恐怕易如反掌了。本题的要求就是输入数独题目,程序输出数独的唯一解。我们保证所有已知数据的格式都是合法的,并且题目有唯一的解。格式要求,输入9行,每行9个数字,0代表未知,其它数字为已知。输出9行,每行9个数字表示数独的解。#inclu原创 2021-03-20 21:21:20 · 85 阅读 · 0 评论 -
贪心算法
贪心算法使用贪心思想的一般方法:1.其核心思想是利用题目性质,证明在某些情况下某种决策一定比另一种决策更优,或者一定不会被另一个决策更优,从而达到优化时间复杂度和简化问题的目的2.猜测或推导出正确的结论3.利用结论,设计决策方法利用步骤2和步骤3是利用贪心思想的关键,其中证明结论的正确性尤其重要(困难)一个典型的贪心问题:背包问题:你有n种物品,背包可容纳重量m,每种物品重量分别为g[i]g[i]g[i],价值分别为v[j]v[j]v[j],每种物品你可以装任意重量,问怎么样才可以使背包内物品原创 2021-03-07 18:16:58 · 91 阅读 · 0 评论 -
搜索算法——DFS
DFSDFS,深度优先搜索,其过程可以简化为对每一个可能的分支路径深入到不能再深入的位置,而且每个结点只能访问以一次。算法流程:1.将初始结点入栈2.访问栈顶元素3.如果至少有一个与此点邻接且未被遍历的点,将其中一个入栈,否则将其出栈4.重复2,3步,直到栈空请观察并分析下图如果以1作为根结点的话,入栈和出栈顺序是怎样的呢?分析:先把1入栈,发现2,6未被遍历,我们将2入栈(我们可以人为规定先将序号较小的数入栈),发现3,4未遍历,将3入栈,发现5未遍历,将5入栈,发现4,7未遍历,将4原创 2021-03-19 00:16:30 · 113 阅读 · 0 评论 -
搜索算法——BFS
广度优先搜索算法是最简便的图的搜索算法之一,又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS以广度作为状态转移依据,BFS会优先访问本层的所以结点,然后进入下一层我们使用队列来实现此算法1.将起点加入队列2.从队首取出一个结点3.扫描这个结点能到的所有未被访问的结点,将他们入队4.重复步骤2和3,直到队列为空,结束以上图为例讲解算法流程:首先将1入队,将1出队,扫描1能到的未被访原创 2021-03-19 19:05:05 · 190 阅读 · 0 评论 -
八皇后问题
思路1.初始状态为第一行,所有地方均可放棋子2.当前的状态是当前的行数,和那些不能放棋子的地方,深度即为行数3.状态转移的方式是找能落子的地方落下,进入下一行4.终止状态是深度为n+1,即每行已经落子代码#include<iostream>#include<cstdio>using namespace std;int n;int ans1;int ans2[10010];int vis1[10010];int vis2[10010];int vis3[1.原创 2021-03-19 00:15:36 · 48 阅读 · 0 评论