
程序设计与算法(二)算法基础_郭炜
奋斗吧!骚年!
一名爱健身的软件工程本科生
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
算法基础:4115:鸣人和佐助--广度优先搜索
题目:佐助被大蛇丸诱骗走了,鸣人在多少时间内能追上他呢?已知一张地图(以二维矩阵的形式表示)以及佐助和鸣人的位置。地图上的每个位置都可以走到,只不过有些位置上有大蛇丸的手下,需要先打败大蛇丸的手下才能到这些位置。鸣人有一定数量的查克拉,每一个单位的查克拉可以打败一个大蛇丸的手下。假设鸣人可以往上下左右四个方向移动,每移动一个距离需要花费1个单位时间,打败大蛇丸的手下不需要时间。如果鸣人查克拉消耗完了,则只可以走到没有大蛇丸手下的位置,不可以再移动到有大蛇丸手下的位置。佐助在此期间不移动,大蛇丸的手下也原创 2021-03-04 21:11:48 · 503 阅读 · 1 评论 -
算法基础:4127:迷宫问题--广度优先搜索算法
题目:定义一个矩阵:0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0它表示一个迷宫,其中的1表示墙壁,0表示可以走的路,只能横着走或竖着走,不能斜着走,要求编程序找出从左上角到右下角的最短路线。输入一个5 × 5的二维数组,表示一个迷宫。数据保证有唯一解。输出左上角到右下角的最短路径,格式如样例所示。样例输入0 1 0 0 00 1 0 1 00 0 0 0 00 1 1 1 00 0 0 1 0样例输出(0, 0)(1, 0原创 2021-03-03 21:21:38 · 304 阅读 · 1 评论 -
算法基础:抓住那头牛--广度优先搜索算法
题目:农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(0<=N<=100000),牛位于点K(0<=K<=100000)。农夫有两种移动方式:1、从X移动到X-1或X+1,每次移动花费一分钟2、从X移动到2*X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?输入两个整数,N和K输出一个整数,农夫抓到牛所要花费的最小分钟数样例输入5 17样例输出4这是一个典型的广度优先搜索算法,用队列来一原创 2021-02-25 21:02:50 · 970 阅读 · 0 评论 -
算法基础:踩方格--深度优先搜索算法
题目:有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:a. 每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;b. 走过的格子立即塌陷无法再走第二次;c. 只能向北、东、西三个方向走;请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。输入允许在方格上行走的步数n(n <= 20)输出计算出的方案数量样例输入2样例输出7#include <iostream>using names原创 2021-02-25 16:43:45 · 497 阅读 · 0 评论 -
算法基础:城堡问题--深度优先搜索算法
题目:图1是一个城堡的地形图。请你编写一个程序,计算城堡一共有多少房间,最大的房间有多大。城堡被分割成m×n(m≤50,n≤50)个方块,每个方块可以有0~4面墙。输入程序从标准输入设备读入数据。第一行是两个整数,分别是南北向、东西向的方块数。在接下来的输入行里,每个方块用一个数字(0≤p≤50)描述。用一个数字表示方块周围的墙,1表示西墙,2表示北墙,4表示东墙,8表示南墙。每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。输入的数据保证原创 2021-02-25 12:11:58 · 675 阅读 · 0 评论 -
算法基础:最长公共子序列--动态规划
题目:给出两个字符串,求出这样的一个最长的公共子序列的长度:子序列中的每个字符都能在两个原串中找到,而且每个字符的先后顺序和原串中的先后顺序一致。Sample Input(输入):abcfbc abfcabprogramming contestabcd mnpSample Output(输出):420思路:输入两个串s1,s2,设MaxLen(i,j)表示:s1的左边i个字符形成的子串,与s2左边的j个字符形成的子串的最长公共子序列的长度(i,j从0开始算)MaxLen(i,j) 就原创 2021-02-23 17:45:16 · 178 阅读 · 0 评论 -
算法基础:最长上升子序列--动态规划
题目:一个数的序列ai,当a1 < a2 < … < aS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们可以得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N。比如,对于序列(1, 7, 3, 5, 9, 4, 8),有它的一些上升子序列,如(1, 7), (3, 4, 8)等等。这些子序列中最长的长度是4,比如子序列(1, 3, 5, 8). 你的任务,原创 2021-02-22 22:07:54 · 652 阅读 · 0 评论 -
算法基础:数字三角形--递归,动态规划
参考于程序设计与算法(二)算法基础郭炜https://www.icourse163.org/learn/PKU-1001894005?tid=1450413466#/learn/content?type=detail&id=1214952558题目:在上面的数字三角形中寻找一条从顶部到底边的路径,使得路径上所经过的数字之和最大。路径上的每一步都只能往左下或右下走。只需要求出这个最大和即可,不必给出具体路径。三角形的行数大于1小于等于100,数字为 0 - 99。输入格式:5 //三角形原创 2021-02-22 17:57:38 · 635 阅读 · 0 评论 -
算法基础:快速排序--分治算法
分治的典型应用:快速排序数组排序任务可以如下完成:1)设k=a[0], 将k挪到适当位置,使得比k小的元素都在k左边,比k大的元素都在k右边,和k相等的,不关心在k左右出现均可 (O(n)时间完成)2) 把k左边的部分快速排序3) 把k右边的部分快速排序递归思路,当快速排序只剩一个数时,就返回。#include <iostream>using namespace std;void swap(int & a,int & b) //交换变量a,b值 { int tm原创 2021-02-22 10:40:09 · 165 阅读 · 0 评论 -
算法基础:归并排序--分治算法
归并排序:数组排序任务可以如下完成:把前一半排序把后一半排序把两半归并到一个新的有序数组,然后再拷贝回原数组,排序完成。这是一个递归思路,把前一半排序又会分成把前一半排序,把后一半排序,最后结束条件就是当只剩一个数的时候就停止递归返回。归并排序 它需要额外的数组开销,它可以指定排序的区间。#include <iostream>using namespace std;void Merge(int a[],int s,int m, int e,int tmp[]) {//将数原创 2021-02-22 10:31:21 · 116 阅读 · 0 评论 -
算法基础:Aggressive cows--二分算法
题目:农夫约翰建造了一个新的长谷仓,其中有N个(2 <= N <= 100,000)摊位。档位沿直线位于位置x1,…,xN(0 <= xi <= 1,000,000,000)。他的C(2 <= C <= N)头母牛不喜欢这种谷仓布局,一旦放到摊子里就会变得互相攻击。为了防止母牛互相伤害,FJ希望将母牛分配给摊位,以使它们之间的最小距离尽可能大。最大最小距离是多少?输入:第1行:两个以空格分隔的整数:N摊位数和C牛数第2…N + 1行:第i + 1行包含整数停滞位原创 2021-02-21 19:11:25 · 1243 阅读 · 0 评论 -
算法基础:二分法求方程的根--二分算法
题目:求下面方程的一个根:f(x) = x3-5x2+10x-80 = 0若求出的根是a,则要求 |f(a)| <= 10-6。思路:对f(x)求导,得f’(x)=3x2-10x+10。由一元二次方程求根公式知方程f’(x)= 0 无解,因此f’(x)恒大于0。故f(x)是单调递增的。易知 f(0) < 0且f(100)>0,所以区间[0,100]内必然有且只有一个根。由于f(x)在[0,100]内是单调的,所以可以用二分的办法在区间[0,100]中寻找根。#include <原创 2021-02-21 17:30:38 · 1673 阅读 · 0 评论 -
算法基础:二分查找函数--二分算法
一、 写一个函数BinarySeach,在包含size个元素的、从小到大排序的int数a里查找元素p,如果找到,则返回元素下标,如果找不到,则返回-1。要求复杂度O(log(n))int BinarySearch(int a[],int size,int p){ int L = 0; //查找区间的左端点 int R = size - 1; //查找区间的右端点 while( L <= R) { //如果查找区间不为空就继续查找 int mid = L+(R-L)/2; //取查找区间正原创 2021-02-21 17:03:18 · 412 阅读 · 0 评论 -
算法基础:电影节--贪心
题目:大学生电影节在北大举办! 这天,在北大各地放了多部电影,给定每部电影的放映时间区间,区间重叠的电影不可能同时看(端点可以重合),问李雷最多可以看多少部电影。输入:多组数据。每组数据开头是n(n<=100),表示共n场电影。接下来n行,每行两个整数(均小于1000),表示一场电影的放映区间n=0则数据结束输出:对每组数据输出最多能看几部电影Sample Input121 33 40 73 815 1915 2010 158 186 125 104 142 9原创 2021-02-20 11:49:37 · 365 阅读 · 0 评论 -
算法基础:圣诞老人的礼物--贪心
题目:圣诞节来临了,圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿雪橇最多只能装下重量W的糖果,请问圣诞老人最多能带走多大价值的糖果。输入第一行由两个部分组成,分别为糖果箱数正整数n(1 <= n <= 100),驯鹿能承受的最大重量正整数w(0 < w < 10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重量正整数w,中间用空格隔开。输出输出原创 2021-02-20 10:29:26 · 946 阅读 · 0 评论 -
算法基础:算24--递归
题目:给出4个小于10个正整数,你可以使用加减乘除4种运算以及括号把这4个数连接起来得到一个表达式。现在的问题是,是否存在一种方式使得得到的表达式的结果等于24。这里加减乘除以及括号的运算结果和运算的优先级跟我们平常的定义一致(这里的除法定义是实数除法)。比如,对于5,5,5,1,我们知道5 * (5 – 1 / 5) = 24,因此可以得到24。又比如,对于1,1,4,2,我们怎么都不能得到24。输入:输入数据包括多行,每行给出一组测试数据,包括4个小于10个正整数。最后一组测试数据中包括4个0原创 2021-02-18 17:15:14 · 566 阅读 · 0 评论 -
算法基础:放苹果--递归
题目:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?5,1,1和1,5,1 是同一种分法。输入:第一行是测试数据的数目t(0 <= t <= 20)。以下每行均包含二个整数M和N,以空格分开。1<=M,N<=10。输出:对输入的每组数据M和N,用一行输出相应的K。样例输入:17 3样例输出:8#include <iostream>using namespace std;int f(int m,int n){原创 2021-02-17 18:35:22 · 305 阅读 · 0 评论 -
算法基础:爬楼梯--递归
题目:树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级,也可以第一次走两级,第二次走一级,一共3种方法。输入:输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 30输出不同的走法数,每一行输入对应一行输出:不同的走法数,每一行输入对应一行输出样例输入5810样例输出83489#include <iostream>using namespa原创 2021-02-17 17:31:23 · 474 阅读 · 0 评论 -
算法基础:四则运算表达式--递归
题目:输入为四则运算表达式,仅由整数、+、-、*、/ 、(、) 组成,没有空格,要求求其值。假设运算符结果都是整数。"/"结果也是整数。输入:(2+3)*(5+7)+9/3输出: 63#include <iostream>#include <cstring>#include <cstdlib>using namespace std;int factor_value();int term_value();int expression_value();i原创 2021-02-17 17:14:31 · 549 阅读 · 0 评论 -
算法基础:波兰表达式--递归
波兰表达式是一种把运算符前置的算术表达式 ,例如普通的表达式2 + 3的波兰表示法为+ 2 3。波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的波兰表示法为* + 2 3 4。本题求解波兰表达式的值,其中运算符包括+ - * /四个。(2) “运算符 波兰表达式 波兰表达式” 是波兰表达式 ,值为两个波兰表达式的值运算的结果。2.所以一点一点读入,如果是符号则返回对应符号的表达式定义,如果是值则直接返回值。(1) 一个数是一个波兰表达式,值为该数。原创 2021-02-17 15:16:10 · 1282 阅读 · 2 评论 -
算法基础:N皇后--递归
题目:输入整数n, 要求n个国际象棋的皇后,摆在n*n的棋盘上,互相不能攻击,输出全部方案。(皇后的攻击方式是横、竖、斜)输入:输入一个正整数N,则程序输出N皇后问题的全部摆法。输出:输出结果里的每一行都代表一种摆法。行里的第i个数字如果是n,就代表第i行的皇后应该放在第n列。皇后的行、列编号都是从1开始算。样例输入:4样例输出:2 4 1 33 1 4 2#include <iostream>#include <cmath>using namespace原创 2021-02-17 12:38:08 · 484 阅读 · 0 评论 -
算法基础:汉诺塔--递归
题目:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。有一个和尚想把这64个盘子从A座移到C座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求输出移动的步骤。#include <iostream>using namespace std;void Hanoi(int n,char src,char mid,char dest)//将src座上的n个盘子,以mid原创 2021-02-16 17:55:43 · 691 阅读 · 0 评论 -
算法基础:熄灯问题--枚举
题目:有一个由按钮组成的矩阵, 其中每行有6个按钮, 共5行 – 每个按钮的位置上有一盏灯当按下一个按钮后, 该按钮以及周围位置(上边, 下边, 左 边, 右边)的灯都会改变状态如果灯原来是点亮的, 就会被熄灭如果灯原来是熄灭的, 则会被点亮• 在矩阵角上的按钮改变3盏灯的状态• 在矩阵边上的按钮改变4盏灯的状态• 其他的按钮改变5盏灯的状态与一盏灯毗邻的多个按钮被按下时,一个操作会抵消另一次操作的结果给定矩阵中每盏灯的初始状态,求一种按按钮方案,使得所有的灯都熄灭输入:第一行是一个正整数N原创 2021-02-16 17:08:46 · 238 阅读 · 0 评论 -
算法基础:假币问题--枚举
题目:有12枚硬币。其中有11枚真币和1枚假币。假币和真币重量不同,但不知道假币比真币轻还是重。现在,用一架天平称了这些币三次,告诉你称的结果,请你找出假币并且确定假币是轻是重(数据保证一定能找出来)。输入:第一行是测试数据组数。每组数据有三行,每行表示一次称量的结果。银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币 天平右边放置的硬币 平衡状态。其中平衡状态用"up’’, "down’’, 或 "even’'表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等原创 2021-02-15 17:55:15 · 1010 阅读 · 1 评论 -
算法基础:生理周期--枚举
题目:人有体力、情商、智商的高峰日子,它们分别每隔23天、28天和33天出现一次。对于每个人,我们想知道何时三个高峰落在同一天。给定三个高峰出现的日子p,e和i(不一定是第一次高峰出现的日子), 再给定另一个指定的日子d,你的任务是输出日子d之后,下一次三个高峰落在同一天的日子(用距离d 的天数表示)。例如:给定日子为10,下次出现三个高峰同一天的日子是12,则输出2。输入:输入四个整数:p, e, i和d。 p, e, i分别表示体力、情感和智力高峰出现的日子。d是给定的日子,可能小于p, e或 i原创 2021-02-15 16:07:33 · 313 阅读 · 0 评论 -
算法基础:完美立方--枚举
题目:完美立方形如a3= b3 + c3 + d3的等式被称为完美立方等式。例如123= 63 + 83 + 103 。编写一个程序,对任给的正整数N (N≤100),寻找所有的四元组(a, b, c, d),使得a3 = b3 + c3 + d3,其中a,b,c,d 大于 1, 小于等于N,且b<=c<=d。输入一个正整数N (N≤100)。输出每行输出一个完美立方。输出格式为:Cube = a, Triple = (b,c,d)其中a,b,c,d所在位置分别用实际求出四元组值原创 2021-02-14 17:31:29 · 404 阅读 · 0 评论