
基础算法
HanYQ_NWUer
这个作者很懒,什么都没留下…
展开
-
每日一道算法题:高楼扔鸡蛋问题(动态规划问题)
题目是这样:你面前有一栋从 1 到N共N层的楼,然后给你K个鸡蛋(K至少为 1)。现在确定这栋楼存在楼层0 <= F <= N,在这层楼将鸡蛋扔下去,鸡蛋恰好没摔碎(高于F的楼层都会碎,低于F的楼层都不会碎)。现在问你,最坏情况下,你至少要扔几次鸡蛋,才能确定这个楼层F呢?首先我们来看一下,什么叫做最坏情况下,至少要仍几次鸡蛋,才能确定这个楼层F?我们来举个简单的例子,当鸡蛋为1个...原创 2019-11-18 10:35:40 · 2587 阅读 · 2 评论 -
6大基本排序排序算法总结(附c++代码实现)
**1、选择排序过程简单描述:首先,找到数组中最小的那个元素,其次,将它和数组的第一个元素交换位置(如果第一个元素就是最小元素那么它就和自己交换)。其次,在剩下的元素中找到最小的元素,将它与数组的第二个元素交换位置。如此往复,直到将整个数组排序。这种方法我们称之为选择排序。#include<iostream>#include<algorithm>using na...原创 2019-05-23 22:57:32 · 178 阅读 · 0 评论 -
c++ 表达式求值
引言:现实生活中,我们使用的表达式为中缀表达式,但这对于计算机来说却是无法理解的,而计算机却能理解前缀表达式和后缀表达式。前缀表达式表示:<操作符><操作数><操作数>,例如+AB;中缀表达式表示:<操作数><操作符><操作数>,例如A+B;后缀表示式表示:<操作数><操作数><操作符>...原创 2019-11-13 15:27:24 · 2262 阅读 · 0 评论 -
51nod 1413 权势二进制
题目传送门巧妙思路:求n中所有位数上最大的一个数,原因是所有权势二进制数都由0、1组成比如说9998,那么要想得到最高位的9,肯定需要9个1xxx相加。#include<iostream>#include<algorithm>using namespace std;int main(){ int n; cin >> n; int ans =0...原创 2019-11-13 09:51:29 · 101 阅读 · 0 评论 -
用双向链表实现LRU算法(c++)
实现LRU算法的方式有两种:数组和单链表。讲讲我为什么要用链表模拟实现。其实我们知道,cpu从外存取数据到内存是以块为基本单位的,也就是说cpu取一块连续的地址到内存内,这样说的话是不是对数组友好点?因为数组用连续的地址存储着相同类型的数据。但是在我考虑在实际应用中,如果需要分配的地址过大时,可能会由于各种原理(存储空间有限或者空间碎片化)无法分配一块连续的地址给数组,而且在频繁的插入删除操作面...原创 2019-11-11 09:58:41 · 797 阅读 · 0 评论 -
关于数组越界问题小结
数组是一种线性数据结构,具有连续的内存,用来存储具有相同类型的数据一、关于数组和链表的比较。-------数组适合查找,时间复杂度为O(1),链表适合插入删除,时间复杂度是O(1)这句话其实是不对的,即使是拍好序的数据,查找的时间复杂度也是O(logn),应该说数组支持随机访问,根据下标访问的时间复杂度是O(1)。二、关于数组越界问题。#include<stdio.h>i...原创 2019-11-06 10:46:29 · 570 阅读 · 0 评论 -
关于为什么要学习数据结构与算法的再思考以及对时间空间复杂度的分析
一、我理解的数据结构和算法什么是数据结构,什么是算法?从广义上来讲数据结构就是指一组数据的存储结构,而算法则操作数据的一组方法。为什么市面上的书籍都是将数据结构和算法放在一起讲?数据结构是为算法服务的,算法是要作用在特定的数据结构上。数据结构是静态的,他只是数据组织的一种方式,如果不在它的基础上构建和使用算法,孤立的数据结构是没有任何作用的。因此数据结构与算法是相辅相成的,我们无法孤立数据...原创 2019-11-03 16:14:45 · 316 阅读 · 0 评论 -
51nod 2489 小b和灯泡
小b有n个关闭的灯泡,编号为1…n。小b会进行n轮操作,第i轮她会将编号为i的倍数的灯泡的开关状态取反,即开变成关,关变成开。求n轮操作后,有多少灯泡是亮着的。收起输入输入一个数字表示灯泡数n,其中1<n≤10000000输出输出一个数字表示最终亮着的灯泡数输入样例3输出样例1思路:求亮着的灯泡数是在求1~n中每个数因子的个数,打表后会发现当i为奇数或sqrt(i)不是整数...原创 2019-06-30 23:41:53 · 187 阅读 · 0 评论 -
51nod 1413 权势二进制
题目传送门巧妙思路:求n中所有位数上最大的一个数,原因是所有权势二进制都由0、1组成比如说9998,那么要想得到最高位的9,肯定需要9个1xxx相加。#include<iostream>#include<algorithm>using namespace std;int main(){ int n; cin >> n; int ans =0;...原创 2019-06-30 10:17:06 · 108 阅读 · 0 评论 -
51nod 1906 字段统计
给定一个字符串S,只由k种小写字母组成。现在给定一个长度L,要求统计一下S有多少种不同的长度为L的子段(S中连续的几个字符)。收起输入单组测试数据。第一行两个整数L和k。(L>=1,1<=k<=26,kL<=2*107)第二行一个字符串S。(1<=|S|<=1000000)输出输出一个整数表示答案。输入样例1 2ababab输出样例2解...原创 2019-07-03 18:03:55 · 271 阅读 · 0 评论 -
关于贪心算法之活动安排问题的理解
问题一:有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?求一个教室能安排几个活动,那么就是说用一个教室去选择最多的活动,那么最优的方法肯定就是选择的活动都能不重叠的按次序开始,也就是说每个活动的结束那么恰好在最短的等待时间内有一个活动开始,但如何选择?能否按照开始时间进行选择,先选择开始时间最早的一个活动,结束后选择等待时间开始最早...原创 2019-06-28 10:27:40 · 979 阅读 · 0 评论 -
51nod 1770 数数字
输入样例23 3 9 103 3 0 10输出样例100思路总结:n个a乘以b,总结起来一共有三种情况:a×b没有进位,结果所有的位数一致(a×b<10)a×b有进位,且进位和下一位乘积相加也有进位((a×b<10)&&(a×b)%10+(a×b)/10>=10)。a乘b有进位,但进位和下一位乘积相加没有进位((a×b<10)&...原创 2019-06-22 17:13:58 · 107 阅读 · 0 评论 -
数组循环移位(c++实现)
题目论述;给定一个数组和正整数n(n小于数组长度),请将此数组循环左移n个位置。例:输入:[1,3,5,8,6],3输出:[8,6,1,3,5] #include<iostream>using namespace std;void reserve(int *a,int l, int r);int main(){ int n,local; cin >>...原创 2019-05-27 19:32:38 · 3241 阅读 · 0 评论 -
51nod 2006 飞行员配对(二分图最大匹配)(c++实现)
第二次世界大战时期,英国皇家空军从沦陷国征募了大量外籍飞行员。由皇家空军派出的每一架飞机都需要配备在航行技能和语言上能互相配合的2名飞行员,其中1名是英国飞行员,另1名是外籍飞行员。在众多的飞行员中,每一名外籍飞行员都可以与其他若干名英国飞行员很好地配合。如何选择配对飞行的飞行员才能使一次派出最多的飞机。对于给定的外籍飞行员与英国飞行员的配合情况,试设计一个算法找出最佳飞行员配对方案,使皇家空 军...原创 2019-05-28 16:28:03 · 250 阅读 · 0 评论 -
51nod 1119 机器人走方格V2
M * N的方格,一个机器人从左上走到右下,只能向右或向下走。有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果。收起输入第1行,2个数M,N,中间用空格隔开。(2 <= m,n <= 1000000)输出输出走法的数量 Mod 10^9 + 7。输入样例2 3输出样例3题目传送门刚开始考虑从左上角走到右下角每走一步下一步共有两种选...原创 2019-06-05 22:31:31 · 162 阅读 · 0 评论 -
51nod 2517 最少01翻转次数(c++实现)
小b有一个01序列,她每次可以翻转一个元素,即将该元素异或上1。现在她希望序列不降,求最少翻转次数。收起输入第一行输入一个数n,其中1≤n≤20000;第二行输入一个由‘0’和‘1’组成的字符串输出输出一个非负整数,表示翻转次数输入样例6010110输出样例2在刚开始做这道题时,看到“序列不降“”想到的是找到第一个为1的字符,然后将后面为0的字符翻转为1,这种方法可以得到...原创 2019-05-29 19:44:41 · 1012 阅读 · 0 评论 -
51nod 1138 连续整数的和
给出一个正整数N,将N写为若干个连续数字和的形式(长度 >= 2)。例如N = 15,可以写为1 + 2 + 3 + 4 + 5,也可以写为4 + 5 + 6,或7 + 8。如果不能写为若干个连续整数的和,则输出No Solution。收起输入输入1个数N(3 <= N <= 10^9)。输出输出连续整数中的第1个数,如果有多个按照递增序排列,如果不能分解为若干个连续整...原创 2019-06-18 21:47:21 · 155 阅读 · 0 评论 -
51nod1095 Anigram单词(c++)
一个单词a如果通过交换单词中字母的顺序可以得到另外的单词b,那么定义b是a的Anigram,例如单词army和mary互为Anigram。另:相同的2个单词不算Anigram。现在给定一个字典,输入Q个单词,从给出的字典中找出这些单词的Anigram。收起输入第1行:1个数N,表示字典中单词的数量。(1 <= N <= 10000)第2 - N + 1行,字典中的单词,单词长度...原创 2019-06-09 11:15:30 · 402 阅读 · 0 评论 -
51nod 骨牌覆盖(c++实现)
在2N的一个长方形方格中,用一个12的骨牌排满方格。问有多少种不同的排列方法。例如:2 * 3的方格,共有3种不同的排法。(由于方案的数量巨大,只输出 Mod 10^9 + 7 的结果)输入输入N(N <= 1000)输出输出数量 Mod 10^9 + 7输入样例3输出样例3思路总结:考虑在2N的长方形中,用12的骨牌铺满方格,首先考虑N=1,只有竖着放一种方式f(1...原创 2019-06-04 12:52:18 · 963 阅读 · 0 评论 -
动态规划篇——最长公共子序列(c++)
引言:最长公共子序列属于动态规划的基础篇,由字符串的最长公共最序列可以引出很多的问题。最长子序列详细讲解以及练习题目需要详细讲解教程的可以观看上面链接的文章,以下是自己做的简单的概括。一、何为最长公共子序列A和B的公共子序列中长度最长的(包含元素最多的)叫做A和B的公共子序列。仍然用序列1,3,5,4,2,6,8,7和序列1,4,8,6,7,5它们的最长公共子序列是:1,4,8,7...原创 2019-06-11 17:28:51 · 14852 阅读 · 0 评论 -
51nod - 1092 回文字符串(c++)
回文串是指aba、abba、cccbccc、aaaa这种左右对称的字符串。每个字符串都可以通过向中间添加一些字符,使之变为回文字符串。例如:abbc 添加2个字符可以变为 acbbca,也可以添加3个变为 abbcbba。方案1只需要添加2个字符,是所有方案中添加字符数量最少的。收起输入输入一个字符串Str,Str的长度 <= 1000。输出输出最少添加多少个字符可以使之变为回文...原创 2019-06-11 17:39:42 · 291 阅读 · 0 评论 -
51nod 1050 循环数组的最大字段和(c++实现)
N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。收起输入第1行:整数序列的长度N(2 &l...原创 2019-05-30 11:32:09 · 207 阅读 · 0 评论