算法笔记
moumoumouwang
这个作者很懒,什么都没留下…
展开
-
BFS专题
题目:在m*n矩阵中找出块的个数(块“相邻为1的点组合而成)1 1 0 00 0 1 11 0 0 1则相邻整体块数为 3BFS实现:#include <cstdio>#include <iostream>#include <queue>#include <algorithm>#include <string.h>#include <cmath>using namespace std;const int m原创 2021-01-15 21:21:29 · 114 阅读 · 0 评论 -
2020-08-14
输入格式:输入的第一行是单个整数T,测试用例的数量(1≤T≤100)。每个测试用例开始一行包含空格隔开两个整数N M (1≤N,M≤1000)代表糖果网格的尺寸,紧随其后的是N行,每一个包含M个空格隔开整数,代表这一行糖果的健康值。网格中的每个整数将不小于- 2000,也不大于2000。输出格式:对于每个测试用例,打印包含单个整数的一行,该整数表示从非空子矩形中可以获得的健康值的最大总和。输入样例:在这里给出一组输入。例如:13 3-4 -2 -1-3 2 31 4 5输.原创 2020-08-16 13:04:58 · 273 阅读 · 0 评论 -
3-4 斐波那契数列(II) (25分)
已知斐波那契数列 Fn =Fn−1+Fn−2 (n>=3), F1=1,F2=1求解该数列的第n项,结果对998244353取模。输入格式:输入一个正整数n (1<=n<=10000000)。输出格式:输出一个数,数列的第n项输入样例1:1输出样例1:1输入样例2:3输出样例2:2思路: 我刚开始用的普通递归但有一个测试点过不了,出现的问题就是,因为递归不停反复运算导致数据量太大。后来考虑了优化递归就是开一维数组保存了递归结果,但是原创 2020-08-11 22:38:02 · 1036 阅读 · 0 评论 -
3-1 最长公共子序列长度 (15分)
动态规划问题pat不可以用gets函数,就换成了fgets函数#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>const int N = 100;using namespace std;char A[N], B[N];int dp[N][N];int main(){ fgets(A + 1, 100, stdin); fge原创 2020-08-11 12:56:38 · 1236 阅读 · 2 评论 -
9.6并查集 codeup问题 A: 通信系统
题目描述某市计划建设一个通信系统。按照规划,这个系统包含若干端点,这些端点由通信线缆链接。消息可以在任何一个端点产生,并且只能通过线缆传送。每个端点接收消息后会将消息传送到与其相连的端点,除了那个消息发送过来的端点。如果某个端点是产生消息的端点,那么消息将被传送到与其相连的每一个端点。为了提高传送效率和节约资源,要求当消息在某个端点生成后,其余各个端点均能接收到消息,并且每个端点均不会重复收到消息。现给你通信系统的描述,你能判断此系统是否符合以上要求吗?输入输入包含多组测试数据。每两组输入数原创 2020-09-05 11:00:51 · 113 阅读 · 0 评论 -
矩阵链相乘问题
参考文章530 35 15 5 10 20输出样例:在这里给出相应的输出。例如:11875AC代码:#include <iostream>#include <cstdio>using namespace std;const int maxn = 10000;int p[maxn], n;int m[maxn][maxn], s[maxn][maxn]; // 记录最小乘法运算次数,和最后一次运算的位置int r; // r为链长int Matri原创 2020-08-13 20:30:38 · 319 阅读 · 0 评论 -
简易计算器 栈队列的应用
题目描述读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值。输入测试输入包含若干测试用例,每个测试用例占一行,每行不超过200个字符,整数和运算符之间用一个空格分隔。没有非法表达式。当一行中只有0时输入结束,相应的结果不要输出。输出对每个测试用例输出1行,即该表达式的值,精确到小数点后2位。样例输入30 / 90 - 26 + 97 - 5 - 6 - 13 / 88 * 6 + 51 / 29 + 79 * 87 + 57 * 920样例输出原创 2020-07-20 18:47:43 · 178 阅读 · 0 评论 -
1060 Are They Equal (25分) STL「string」
原题链接这道题真的值得好好品 从思路再到细节处理都挺妙的特别注意点:会有前导0思路一、考虑数据本身 可以分为两种情况第一种:0.a1a2a3…第二种:b1b2b3…bm . a1a2a3二、考虑两种情况的主体与指数部分综上,整个过程可以分为三大部分1.去除前导0 (考虑到前导零存在的情况 经过此步骤以后 根据字符串首位是否为‘.’便可以区分为第一种情况还是第二种情况了)2. 初步构造字符串(首字符大于0且不含小数点)也是寻找小数点删除小数点的过程这个过程中还需要确定指数第一种数据情况.原创 2020-07-03 20:29:16 · 65 阅读 · 0 评论 -
质因子求解 PAT A1059 Prime Factors (25分)
注意点:Find_Prime()函数中i<maxn 误写成i<=maxnn=1时需要特判#include <cstdio>#include <cmath>struct factor{ int x,cnt;} fac[10];//打印素数表 埃氏筛法const int maxn=100010;bool P[maxn]= {0};int Prime[maxn],Pnum=0;;void Find_Prime(){ for(int i原创 2020-06-01 15:37:48 · 181 阅读 · 0 评论 -
打印素数表 pat1013 数素数
素数打印素数表开根快速判定法埃氏筛法pat1013 数素数打印素数表开根快速判定法方法一:算法复杂度 O(sqrt(n))#include <cmath>#include <cstdio>const int maxn = 200;bool P[maxn]= {0};bool isPrime(int n) //素数判断{ int sqr = (int)sqrt(1.0*n); //sqrt的作用是为一个浮点数开根号,乘1.0就是为了使n变为浮点数 需要添加 m原创 2020-05-31 10:55:58 · 150 阅读 · 0 评论 -
算法笔记 数学问题
原题链接原理:最大公约数:递归 欧几里得算法最小公倍数:得到a,b的最大公约数d 最小公倍数=a/d*b;#include <iostream>#include <cstdio>int gcb(int a,int b) //求最大公约数{ if (b == 0) return a; else return gcb(b, a % b);}int main(){ int n,m,x; while( scanf("%d",&n)!=原创 2020-05-30 14:39:57 · 71 阅读 · 0 评论 -
算法笔记 快速排序
快速排序原理:确定一个元素 使得该元素左侧全部小于该元素 右侧元素全部大于该元素。(递归)时间复杂度:平均(O(nlogn))最坏O(n^2)(总是选A[left]做主元)解决办法:生成随机数,swap(A[p],A[left]) 注意交换函数的写法,需要提供指针以交换地址。头文件cstdlib ctime#include <iostream>#include <cstdio>#include <cstdlib>#include <ctime&g原创 2020-05-27 18:29:32 · 79 阅读 · 0 评论 -
two Pointers问题 序列合并并删除相同元素
#include <cstdio>const int maxn=100;int GuiBing(int A[],int B[],int C[],int m,int n) //序列合并{ int i=0,j=0,k=0; while(i<m&&j<n) { if(A[i]<=B[j]) { C[k++]=A[i++]; } else原创 2020-05-23 08:41:32 · 94 阅读 · 0 评论 -
codeup 数列 (递归 图形输出)
思路:联想到之前的正三角形*图形打印,觉得大同小异,就要去找里边的区别点——那就是打印的数字,而这些数字是可以直接通过斐波那契数列得到的,之前打印的是 符号 现在打印F(k)就好 还挺容易的注意点:printf(“%d”,F(k));返回int也要printf 才能输出斐波那契数列不是规定死的F(0)=1,这道题就是F(0)=0;自己规定就好#include <cstdio>int F(int n){ if(n==0) return 0; else原创 2020-05-18 17:25:07 · 122 阅读 · 0 评论 -
codeup 吃糖果(递推 递归 全局局部变量)
原题目思路:就模仿的斐波那契数列 其实本身题目是简单的 但是不知道为什么c++过不了 换个头文件c能过#include <stdio.h>int Eat(int n){ if(n==1) return 1; else if(n==2) return 2; else return Eat(n-1)+Eat(n-2);}int main(){ int n; //scanf("%d",&n); while(scanf("%d",原创 2020-05-18 11:46:52 · 203 阅读 · 0 评论 -
快速幂 迭代与递归算法
迭代算法补充知识:ab%m=(a%mb%m)%m;#include <cstdio>typedef long long LL;LL binaryPow(LL a,LL b,LL m){ LL ans=1; if(m==1) ans=0; else { while(b>0) { if(b&1)//保证二进制最后一位是1 如果是0就不计入答案里边啦 { ans =原创 2020-05-22 07:56:43 · 243 阅读 · 0 评论