Oj
Lilyan_blog
这个作者很懒,什么都没留下…
展开
-
数论基础——计算最大公约数和最小公倍数
知识简介什么是最大公约数,什么又是最小公倍数呢?| 代表的是 / 除法下面把求最大公约数称为gcd,求最小公倍数称为lcm,他们有什么性质?算法证明原理从1可知,我们求出最大公约数gcd就可以通过公式lcm = (a * b) / gcd即能得到最小公倍数了,那么我们介绍一种常用的求最大公约数的方法,那就是欧几里得算法例题这里给出题目地址:简单基础gcd例题AC...原创 2020-03-14 13:35:00 · 426 阅读 · 0 评论 -
递归入门——数的计算
题目描述2.算法分析:这道题目我们先找规律,比如输入0,1的时候那么肯定只有本身了,所以f[0] = f[1] = 1然后发现2的时候,2本身加上12,所以f[2] = 2,当为3时本身3加上13也是f[3] = 2.。。。。。f[4] = 4 —— 4,14,24,124f[5] = 4——5,15,25,125f[6] = 6——6,16,26,36,126,136f[7] ...原创 2019-01-19 21:14:16 · 863 阅读 · 0 评论 -
括号匹配问题
1.问题描述:2.算法分析:括号匹配问题是比较经典的问题。我们可以使用栈这样的数据结构来解决。我们扫描字符串压将‘(’入栈中,然后如果是’)’我们则可以从栈中弹出一个’('来与之匹配,这样就可以解决并保证最近的两个括号相匹配了,根据题目要求我们在记录下匹配的位置即可。因为题目中说答案不唯一就是说位置可以换一下。比如样例一输出1 42 3如果我们输出2 31 4这样子也是可...原创 2018-12-22 20:01:27 · 473 阅读 · 0 评论 -
汉诺塔递归问题进阶
1.问题描述2.算法分析相信大家对汉诺塔经典的递归问题都有所了解,给你ABC三个柱子,n个盘子放在起始柱子A上,盘子的排列从上至下依次有小到大排列。小的盘子必须放在大的盘子上面。我们每次递归前都将n-1个盘子借助C柱子移动至B柱子,然后我们再将最大的盘子移动至C柱子即可。可以定义一个汉诺塔函数:void hanoi(int A, int B, int C, int n){ if ...原创 2018-12-22 09:10:18 · 560 阅读 · 2 评论 -
蓝桥杯VIP——黑色星期五
1.问题描述2.算法分析典型的日期计算,其实就是枚举思想,首先我们确定从1998.1.1日周四开始枚举,然后判断该年是否为闰年,再去判断当星期数为8时我们需要将星期数重置为星期1开始,当每天的天数等于月末+1天时重置天数为下个月1号,当月份为13时跳出循环,年份+1,再依次循环。最后输出即可。提示:这里有几个坑:首先你判断月末和星期数都要+1而不是星期7就变为1,而且月末+1天也是个坑...原创 2018-12-03 14:49:05 · 713 阅读 · 0 评论 -
搜索入门——小学数学问题
1.问题描述:2.算法分析这道题目使用暴力枚举以及dfs(深度优先搜索)都可以解决。a.暴力枚举:首先我们需要确定枚举的范围:这道题目有12个空,如果枚举12个空的值则需要写12个循环,程序会跑不起来。其实我们只需要枚举算式左边的八个空格,然后右边的空格通过计算来判断即可,这样就是8个循环,全部枚举完就是128这样一个时间复杂度,通常计算机计算1s的时间复杂度是109差不多接近了,...原创 2018-12-03 08:48:38 · 625 阅读 · 0 评论 -
计蒜客——机器人
1.题目描述:2.算法分析:首先我们知道机器人初始状态是在坐标原点,方向是朝右边的。我们也知道在坐标轴上,在排除斜线移动一共就上下左右四种方向移动。我们看题目可以发现一共有四个指令,forward前进指的是在当前方向前进多少单位长度back调头再前进是指当前方向相反方向前进多少个单位长度。left向左是指当前方向逆时针旋转90度后的方向前进 多少个单位长度right...原创 2018-11-28 14:51:29 · 802 阅读 · 0 评论 -
C++十进制转换任意进制
1.题目描述:2.算法分析:如上是将十进制转换1-16进制,并且有可能会输入负数首先我们先考虑当输入的要转换的数为0,那么不管是任何进制,转换都是0.然后考虑进制是否小于10,因为大于等于10之后的进制需要使用字符’A’-‘F’.考虑进制小于10之后我们又需要考虑需要转换得数是否是负数。先考虑正数,用短除法,但是需要注意所取得余数应该逆序输出,所以应该存入字符数组或者字符串操作。...原创 2018-11-28 09:34:11 · 6463 阅读 · 0 评论 -
计蒜客——浮点数排序
1.题目描述:2.算法分析:首先肯定是定义一个double类型数组存放数据,然后的一个问题是怎么判断浮点数最近的整数的差,使用round函数即可floor : 不大于自变量的最大整数ceil :不小于自变量的最大整数round:四舍五入到最邻近的整数floor(),ceil() 需包含头文件math函数库具体可以查C++帮助文档然后我们使用C++的sort函数进行排序,...原创 2018-11-27 15:06:28 · 2492 阅读 · 0 评论 -
蓝桥杯——四平方和
1.问题描述:2.算法分析:这道题目简单粗暴,枚举暴力算法,但是你不能死死的写四个for循环去判断,适当的剪枝会使得你的程序跑起来更快,并且需要注意不要你输出全部的组合,只要输出按照字典序排序输出。什么是字典序?这么说吧在这里比较的就是你的ASCALL值把,0的比1小,字母a比A大,所以你枚举只需要输出最小的能满足条件的a,b,c,d就要跳出所有循环了。如果不是只求出字典序最小的组合,...原创 2018-11-29 20:59:10 · 598 阅读 · 0 评论 -
A+B for Matrices
1.题目描述This time, you are supposed to find A+B where A and B are two matrices, and then count the number of zero rows and columns.输入The input consists of several test cases, each starts with a pai...原创 2018-11-25 15:46:45 · 291 阅读 · 0 评论 -
搜索入门——八皇后问题
1.问题描述:2.问题分析首先八皇后问题相信大家多多少少都有所了解,毕竟是比较经典的回溯搜索问题了。八皇后的规定是每一枚皇后的行列以及左斜线,右斜线上仅此只能存在一个。和国际象棋中的皇后规则一样。如图:画X的是不能放置皇后的如果我们用搜索来做的话我们可以搜索行,然后通过枚举列来判断是否能放,这里最大的难点是找到左斜线以及右斜线的规律,可以看到左斜线的坐标分别为(1,1),(2,2)...原创 2019-02-02 19:47:12 · 991 阅读 · 0 评论 -
搜索进阶——数独问题
1.问题描述:2.问题分析:这道题目是比较经典的搜索问题,当你学会怎么解八皇后问题的时候,就慢慢的进入了搜索之道,这一道题目比较难的点就是33的格子内填充的数不能重复。行和列不重复很简单,怎么判定重复与否,我们将数独棋盘分为9个33的棋盘并且将其编号:可以发现规律每一个编号的33的格子为当前的x,yx / 3 * 3 + y / 3我们可以在主函数里通过设置判断行,列,33格子是...原创 2019-02-03 16:43:31 · 1588 阅读 · 1 评论 -
并查集练习题以及带权并查集简介
1.并查集模板(luogu——P3367)1.问题描述:题目链接2.分析:这道题目就是一道普通的并查集模板题目,只要对并查集的初始化,查找,合并有所了解或者看到上一篇介绍并查集算法的文章,直接敲即可,这里不过多赘述。3.AC_Code:#include <bits/stdc++.h>using namespace std;const int maxn = 1e4 + 5...原创 2019-04-29 21:14:09 · 788 阅读 · 0 评论 -
算法竞赛中一些输出题目的坑点
1.怎么输出多个\首先,我们使用C或C++的标准输入IO流的话两个\或者多个\似乎与OI中的标准输入中的转义字符相冲突,我们可以采用在没输出一个\的时候,在前面多加一个\即可。比如,需要输出\,那么我们就在每个单独的\前多加一个即\\ == \printf("\\\\") ==> \\比如这道题目:哈尔滨工程大学AAC code:#include <cstdio>...原创 2019-04-27 11:23:44 · 460 阅读 · 0 评论 -
01联通块求解——bfs
##1.问题描述:##2.算法分析:其实这道题目就是一个让我们求出一共有多少个联通块问题;首先我们要理解怎样才算是联通块,比如单个的1四周被0包围,算作联通块,或者1连着的1两个1算作一个联通块,只要1的上下左右任一个方向存在1都算作一个联通块,比如样例一:大概就这么个意思。那么我们该怎么做了,比较容易就想到搜索了,我们枚举每一个位置的元素,如果为0,则跳过,如果为1开始搜索。(...原创 2019-04-14 22:08:13 · 829 阅读 · 0 评论 -
PAT 甲级1059 Prime Factors
1.问题描述:题目意思是给定一个整型范围内的n求出这个n能够分解的质因数,若某一个质因子的分解个数超过一个那么使用^次方表示,比如4 = 2 * 2就要写成4 = 2 ^ 2.这样的形式。2.算法分析:其实这一道题目是一道纯数学知识题,首先我们要理解质因子,质数就是素数,我们需要先用线性筛筛出一定范围的素数,打个表。这里给出埃式筛法,时间复杂度为O(nlogn)#include <...原创 2019-03-18 09:58:51 · 302 阅读 · 0 评论 -
DP经典问题LIS——最长上升子序列
1.问题描述:2.算法分析:因为是初学,只学习了O(N^2)的算法复杂度。最后,我们将dp数组的最大值是最长上升子序列的长度。推荐一篇文章包含了O(nlogn)的LIS算法。LIS推荐3.源代码:#include <iostream>#include <cstring>using namespace std;int dp[101], a[101],...原创 2019-02-20 20:06:01 · 322 阅读 · 0 评论 -
PAT乙级1017(A/B)简单高精度
1.问题描述:2.算法分析:这道题目是最近看到PAT乙级的一道题目,大概是这么个思想,明显1000位超过了long long,我们需要用字符串来存储数组,但是因为除数只是个位数,我们只需要模拟除法过程即可,首先我们要考虑到特殊情况,如字符串的长度为1时,那么商就应该是第一个字符与除数相除,那么商就应该是第一个字符与除数mod,对于特判后,我们应该考虑字符串长度大于1时,我们就模拟除法。比如...原创 2019-03-01 20:26:10 · 281 阅读 · 0 评论 -
整数划分问题——递归,dfs求解
1.问题描述:给定任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。当n = 7,共有14种拆分方法:2.算法分析:这道题目我们可以想到其实应该用递归来做,而dfs又是可以使用递归求解,我们首先可以在递归函数里进行拆分的枚举,需要拆分的数应该是能够由哪一些数相加,怎样设计递归函数dfs呢,我们应该清楚应该拆分n,比如n为7的时候,我们先拆了1,那么n还剩下6对吧,所以我们设计...原创 2019-02-25 19:32:05 · 634 阅读 · 0 评论 -
DP入门——硬币问题
1.问题描述:硬币问题是比较古老而又经典的问题,即给定需要凑的硬币,给定几种面值的硬币,问最少所需要的硬币个数凑成。比如 给定15 硬币面值为1 ,5,11三个面值即输入 15输出为最少的硬币个数:32.算法分析:其实硬币问题也可以算是贪心问题,比如给定面值为100 ,50,10,1的面值,我们给定666,如果凑666的话,我们可以从大的凑,再从小的凑,比如666 = 6 * 10...原创 2019-02-14 14:30:37 · 2903 阅读 · 2 评论 -
DP经典问题——马过河卒
1.问题描述:2.算法分析:f[0][0] = 1;for (int i = 0;i <= n; ++i) { for (int j = 0; j <= m; ++j) { if (i != 0) { f[i][j] = f[i][j] + f[i-1][j]; } if (j != 0) { ...原创 2019-02-13 19:28:48 · 455 阅读 · 1 评论 -
搜索入门——全排列问题
1.问题描述:2.算法分析:这道题目其实是搜索入门的一道题搜索,可以使用dfs来搜索,怎么搜索呢,首先我们输入一个n,这个n代表全排列1-n,使用dfs搜索的话,我们要确定边界出口,我们是一步一步去试,每一次次数step + 1,当step比n大的时候就跳出递归,但是我们需要多次搜索,所以需要在选数的时候添加一个记录这个数选与没选的vis标记数组,其实dfs是有模板的,如下:void df...原创 2019-01-29 15:49:06 · 589 阅读 · 0 评论 -
最大子阵
1.题目描述:2.算法分析:其实这道题目最好用的是DP(动态规划)+ 前缀和 组合起来的算法,时间复杂度为O(103),单独用DP为O(104),使用枚举发现还行在这个数据范围内的时间复杂度为O(10^6),但是能效率高还是用效率高的算法。a.使用枚举算法其实就是枚举矩阵的上界下界左界右届,在每个不同的边界围成的矩阵来计算元素和,即可。b.DP…待更新c.Dp+前缀和3.源...原创 2018-11-28 21:15:37 · 172 阅读 · 0 评论 -
计蒜客——节假日
1.问题描述日历有阳历(公历)和阴历(农历)之分。每年都有法定节假日,这些分成三类——双休、阳历节假日、阴历节假日。1.双休1)周六和周日2天2.阳历节假日1)元旦:阳历每年1月1日,放假1天2)劳动节:阳历每年5月1日,放假1天3)国庆节:阳历每年10月1日,放假3天4)圣诞节:阳历每年 12 月 25 日,放假1天3.阴历节假日1)春节:阴历每年1月1日,放假3天2)清...原创 2018-11-23 18:13:27 · 1201 阅读 · 2 评论 -
多处服务点最优时间(贪心算法)
问题描述: 设有n 个顾客同时等待一项服务。顾客i需要的服务时间为ti ,1<= i <= n。共有s 处可以提供此项服务。应如何安排n 个顾客的服务次序才能使平均等待时间达到最小?平均等待时间是n个顾客等待服务时间的总和除以n。编程任务: 对于给定的n个顾客需要的服务时间和s的值,编程计算最优服务次序。数据输入: 第一行有2 个正整数n 和s,表示有n 个顾客且有s ...原创 2018-10-22 20:09:05 · 1503 阅读 · 0 评论 -
活动安排问题(贪心)
源代码实现:#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>using namespace std;int s[101]; //存放活动开始时间 int f[101]; //存放活动结束时间 bool a[101]; //判断该活...原创 2018-10-16 21:27:06 · 542 阅读 · 0 评论 -
最长上升子序列问题
最长上升子序列:给出一个数列{a1,a2,a3.....an},要求你选出尽量多的元素,使这些元素按其相对位置单调递增。例如,输入:5 8 9 2 3 1 7 4 6输出:2 3 4 6最长上升子序列长度为:4#include<iostream>using namespace std;int b[200][4];int main(){ int n; ...原创 2018-10-15 19:40:13 · 682 阅读 · 0 评论 -
矩阵连乘(DP动态规划)
#include<iostream>#include<cstdio>using namespace std;int p[101]; //存放各个矩阵的行列值,比如,矩阵A[i]的行列值为p(i-1)*p(i) int m[101][101]; //存储存放最少数乘次数 int s[101][101]; //存储加括号的位置 void Matrix...原创 2018-10-15 18:27:36 · 834 阅读 · 2 评论 -
最长公共子序列(动态规划DP)
#include<iostream>#include<cstdio>using namespace std;char x[101]; //字符数组x存储字符串x char y[101]; //字符数组y存储字符串y int b[101][101]; //记录c[i][j]怎么来的,以及输出子序列元素 int c[101][101]; //记录 X和Y的...原创 2018-10-14 19:10:31 · 192 阅读 · 0 评论 -
约瑟夫问题(数组解决)
约瑟夫问题:N个人围成一圈,从第一个人开始报数,数到M得人出圈,再由下一个人开始报数,数到M的人出圈,以此类推,输出除权的编号,N,M由键盘输入。算法分析:这一道题目用链表做是比较容易的,但是数组也是可以做的并且也比较容易理解,就比如我们知道N个人只有两种状态,出圈和在圈内,那么我们是不是可以定义一个bool类型数组,规定true为出圈,false还在圈内,最初的时候,大家都在圈内,只需要...原创 2018-10-14 10:38:07 · 5502 阅读 · 0 评论 -
开灯问题(赋上详细思路)
有n盏灯,编号为1-n,第一个人把所有灯打开,第二个人按下所有编号两倍的开关(这些灯被关掉),第三个人按下所有编号三倍的开关,以此类推,一共有k个人,问最后有哪些灯开着?输入:n和k,输出开着的灯的编号,k<=n<=1000样例输入:7 3 样例输出:1 5 6 7算法思路:其实我们可以采用数组存储多少盏灯的状态,然后模拟接下来的人开关灯的操作,怎么...原创 2018-10-13 23:10:16 · 5071 阅读 · 3 评论 -
杭电oj1002(Java)
这题目快坑爹的,我也是提交了蛮多次才通过的,首先他给数据你使用long类型是完全可以处理的但是题目曾提到过需要1000个数字组成吧,挺大的,显然他的隐藏测试数据long类型是完全不符合的,这道题目用java中的BigInteger类型可以完成,具体实现代码:import java.math.*;import java.util.Scanner;public class P1002 ...原创 2018-08-16 18:15:53 · 1125 阅读 · 0 评论 -
计蒜客题库中的矩阵翻转(C++)
晓萌最近在做一个翻转图片的应用,你可能也知道,图片其实是由一个个的点组成的。于是,晓萌想先做一个可以翻转矩阵的程序,来解决他问题的核心部分。输入格式输入第一行包括由空格分开的整数 M,N,T(0 < N,M < 200)M,N,T(0<N,M<200),TT 的值为 00 或 11。其中 MM 和 NN 分别表示待处理矩阵的行数与列数,TT 为 00 时表示左右翻转...原创 2018-06-24 14:38:52 · 781 阅读 · 1 评论 -
计蒜客题库爬楼梯(时间不超限制的递归)C++
今天做计蒜客oj上一道题目爬楼梯比较有意思 65536K假设你现在正在爬楼梯,楼梯有 nn 级。每次你只能爬 11 级或者 22 级,那么你有多少种方法爬到楼梯的顶部?输入格式第一行输入一个整数 n(1\leq n \leq 50)n(1≤n≤50),代表楼梯的级数。输出格式输出爬到楼梯顶部的方法总数。样例输入5样例输出8我们来找一下规律吧如果走一级楼梯,那么只有1这一种走法走两级楼梯,那么有(1...原创 2018-06-26 17:54:54 · 1173 阅读 · 0 评论 -
一般背包问题(贪心)
一般背包问题是求出给定背包容量范围内的最大价值,但是与0-1背包问题不同的是0-1背包问题不能取物品的一部分,只能取或者说没取该物品,一般背包则不同,一般背包可以取物品的一部分来实现最大价值。例如 给定背包容量50,一共有三种物品比如序号 w物品重量 v物品价值 1 20 60 2 30 120 3 10 50 针对上...原创 2018-10-20 21:12:28 · 6096 阅读 · 2 评论 -
蛇形矩阵详解
问题描述:在n*n方阵中填入1,2,3,....,n*n,要求填成蛇形状。如10 11 12 19 16 13 28 15 14 37 6 5 4类似上面这种矩阵像蛇一样弯进来的。分析:首先,我们碰到矩阵这一类问题,我们可以将里面的数据使用二维数组存储。其实每一个蛇形矩阵都是从第一行第n列开始的,先向下移动,当发现移动不了(这里的意思是指越界...原创 2018-10-25 20:21:13 · 5700 阅读 · 0 评论 -
计蒜客打印锯齿矩阵
1.问题描述:2.算法分析:因为发现数组的长度不是固定的,而是可变的,所以我们不能使用静态数组,我们可以使用动态数组vector来做。先确定使用的数据结构vector然后就是先对数组赋值,将比如上题将12个元素赋值,然后有一个要注意的点,就是如果某一行都没有数据,那么,直接换行空一行出来。当没有数据的时候vector数组的长度必然为0再依次打印即可。3.源代码分析:#...原创 2018-11-02 20:19:35 · 397 阅读 · 0 评论 -
C++递归实现十进制转二进制、八进制、十六进制
大家可以关注一下本人自建Blog:http://47.107.118.1841.转二进制与八进制分析我们最熟悉不过的就是短除法将十进制转二进制,将余数倒着输出便是该是十进制的二进制数,那么很容易想到拿十进制数n%2(或者8)这样可以得到最高位的二进制(八进制)数,然后将n/=2(8)继续取余,这样就可以得到下一位,我这里使用字符数组存储,因为2进制只有0-1两个字符,八进制则是0-7 8个...原创 2018-11-04 18:13:40 · 10500 阅读 · 0 评论 -
使用指针实现字符串逆序操作
#include<iostream>#include<cstdio>#include<cstring>using namespace std;void swapp(char &a,char &b) //交换两个字符的位置 { char temp; temp = a; a = b; b = temp;}void wor...原创 2018-11-06 18:22:09 · 8068 阅读 · 0 评论