机试算法讲解
文章平均质量分 71
天地一扁舟
这个作者很懒,什么都没留下…
展开
-
机试算法讲解: 第55题 Piggy-Bank
/*问题:与一个储蓄罐,告知空的质量和当前重量,并给定一些钱币的价值和相应的重量,求储蓄罐中最少有多少现金。输入:包含T组测试用例。第一行。每一个测试用例包含2个整数E和F,表明空储蓄罐的重量和装满钱的重量。<=10,000g,第二行是每个测试用例,包含一个整数N(1<=N<=500), 给出了各种硬币的数量。接下来是N行,每行表示一种硬币类型,每行包括2个整数,...原创 2019-07-30 09:03:11 · 251 阅读 · 0 评论 -
机试算法讲解: 第58题 输入外挂
/*输入外挂:scanf快于 cin,在scanf基础上再次优化,使那些刚超时一点的程序能够卡金时限范围。 原理:在读入缓冲中字符的前提下,手动分析字符串中输入的整数、浮点数等我们需要的输入类型,并将其保存在变量中*/#include #include #include //输入整数,并将整数保存在引用变量ret中bool readint(int& ret){原创 2015-08-02 00:04:43 · 564 阅读 · 0 评论 -
机试算法讲解: 第48题 递推之写信发错啦
/*问题:给N个网友写信,所有信全部装错信封有多少种可能的错误方式输入:n(1<n<=20)输出:错误的方式输入:23输出:12递推求解:n=1,0种,n=2,1种,n=3,2种,n=4,8种。设F[n]为n个信封的装错方式总数。 假设n号信封装的是k号信封,而n号信封中的信装在m号信封里。将k==m分为两类 1)若k!=m,交换n号信封和m号信封,则n原创 2015-08-01 14:49:56 · 570 阅读 · 0 评论 -
机试算法讲解: 第45题 深度优先搜索之寻找沙特石油存储区
/*问题:在n*m的图中,确定有几个@块,块符合以下条件:其中任意对@块均直接或间接相通,两个@直接相邻或者对角相邻即被视为连通输入:m(行号) n(列号),m=0标志输入结束,1<=m,n<=100,接下来是m行每行中有n个字符。每个字符对应一块土地,*代表没有石油,@代表有石油输出:对于每个格子,输出有多少个石油存储区。2个不同的石油处垂直,水平,对角线属于同一个石油存储区。石油存储区<原创 2015-08-01 14:43:03 · 1083 阅读 · 0 评论 -
机试算法讲解: 第39题 DAG之QQ师徒关系
/*问题:QQ群中师徒关系。判定是否存在有向无环图。输入:N(多少个结点),M(需要测试的关系) (2<=N,M<=100),接下来是M行,每一行是 x y,表示x是y的师傅,当N=0时,输入终止,数字时0,1,...,N-1输出:合法师徒为"YES",非法是"NO"思路:采用队列保存入度为0的节点,每找到一个,删除该节点和以该节点为弧尾的所有节点*/#include #inclu原创 2015-08-01 14:32:39 · 617 阅读 · 0 评论 -
机试算法讲解: 第49题 动态规划之最长递增子序列问题
/*最长递增子序列:在一个已知的序列{a1,a2,...,an}中,取出若干数组成心得序列{ai1,ai2,..,aim},其中下标i1,i2,...,im保持递增,即新增数列中的各个数之间依旧保持原数列 中的先后顺序,那么称新的序列为原序列的一个子序列。若在序列中,下标ix > iy时,aix > aiy,称这个子序列为原序列的一个递增子序列。思路:F[i]表示原创 2015-08-01 14:52:50 · 820 阅读 · 0 评论 -
机试算法讲解: 第37题 Dijkstra
/*Dijkstra:单源最短路径。第m+1近的结点与结点1的最短路径上的中间节点一定属于集合K,任意最短路径中间有一个不属于集合K的节点,则它的最短路径距离一定<第m+1近的节点的最短路径长度,与距离与第m+1近的节点的最短路径已经确定、这样的结点属于集合K相矛盾。最短路径 = 从结点1出发经最短路径集合中K中的节点P2 + 算法流程:1)初始化,在集合K中加入结点1,结点1到结点原创 2015-08-01 14:25:53 · 589 阅读 · 0 评论 -
机试算法讲解: 第41题 广度优先搜索之迷宫问题
/*知识:我被魔王抓走,城堡是A*B*C的立方体,即A个B*C的矩阵,我被关在(0,0,0)位置,出口在(A-1,B-1,C-1),魔王在T分钟内回到城堡,我每分钟能移动1个坐标。若 走到出口恰遇魔王,也算成功。请输出多少分钟可以离开,不能则输出-1问题:输入:第一行是1个正整数K,表名测试数据的数量。每组测试数据的第一行时4个正整数A,B,C和T(1<=A,B,C<=50,1<=原创 2015-08-01 14:36:21 · 858 阅读 · 0 评论 -
机试算法讲解: 第35题 欧拉回路之一笔画
/*问题:平面有若干点,用线段将点连接,使任意两点通过一些列线段相连,给出所有点的坐标,求一种连接方法使所有线段的长度和最小,求该长度和本质:点为图上的节点,节点之间的线段为边,权值为其长度,求最小生成树之前需要建立图关键:1 需要建立点结构体,并且计算任意两点之间的距离,赋予边的结构体,再将边排序,求出最小生成树2 输入的类型必须也是浮点类型,接受取值的也是浮点类型。printf("%原创 2015-08-01 14:22:33 · 741 阅读 · 0 评论 -
机试算法讲解: 第33题 并查集之找小伙伴
/*问题:1000 0000个朋友,之中有n对朋友,朋友关系具有传递性。要求找出一个最大(人数最多)的集合,该集合中任意两人都是朋友或者只有1个人,输出最大人数本质:比较每个并查集中元素个数,可以在根结点处设置一个数组用来保存每个根结点对应元素个数,在合并时累加被合并集合中的元素个数输入:41 23 45 61 641 23 45 67 8输出:42*/#in原创 2015-08-01 14:14:16 · 429 阅读 · 0 评论 -
机试算法讲解: 第57题 位运算
/*位运算:1用变量与1求与代替模2操作,大大提高效率2用右移操作代替除法操作,大大提高效率*/#include #include #include int main(int argc,char* argv[]){ int a = 4; if(a & 1 == 1) { printf("%d is JiShu!\n",a); } else { printf("原创 2015-08-02 00:05:09 · 499 阅读 · 0 评论 -
机试算法讲解: 第53题 动态规划之如何摆放橘子
/*问题:有一堆柑橘,重量为0到2000,总重量不大于2000。从中取出两堆放在扁担两头,且两头重量相等,问符合条件的的每堆重量最大是多少。没有符合条件的分堆方式则输出 -1输入:第一行时t,表示t个测试用例,对每个测试用例,包含一个数字n,表名橘子数。第二行有n个数字,表明每个橘子的重量,1<=n<=100.如果是因为存在重量为0的橘子, 导致扁担两边重量为0,那么应该输原创 2015-08-02 00:00:00 · 985 阅读 · 0 评论 -
机试算法讲解:第34题 并查集之求最短公路总长度
/*问题:有任意两个村庄的距离,使全省任意两个村庄之间都可以畅通(不要求直接相连,间接联通也可以),要求铺设公路最短和次最短。请计算最小公路总长度输入:第一行给出村庄数N(<100),随后的N(N-1)/2给出村庄之间的距离,每行给出一对正整数,分别是两个村庄的编号,以及两个村庄之间的距离。村庄从1到N编号,N=0时结束输出:求出最短公路总长度输入:31 2 11 3 22 3 4原创 2015-08-01 14:13:37 · 649 阅读 · 0 评论 -
机试算法讲解: 第38题 求Dijkstra最短路径及花费
/*问题:n个点,m条无向边,,每条边都有长度d和花费p,给你起点s和终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条线,则输出花费最少的输入:输入n,m,点的编号是1~n,然后是m行,每行4个数a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p。最后一行是两个数s,t;起点s,终点t。n和m为0时输入结束。1<=n<=1000,0<m<10000,s!=t输出原创 2015-08-01 14:31:03 · 752 阅读 · 0 评论 -
机试算法讲解: 第54题 0-1背包之如何采药
/*背包:种类:0-1背包,完全背包,多重背包。 0-1背包:含义:有一个容量为V的背包和物品,物品与两个属性,体积W和价值V,每种物品只有1个。 要求用这个背包装下价值尽可能多的物品,求该最大价值,背包可以不被装满。 特点:每个物品至多能选1件,物品数量只有0和1两种情况。 dp[i][j]:表示总体积不超过j的情原创 2015-08-02 00:01:36 · 683 阅读 · 0 评论 -
机试算法讲解:第36题 Floyd
/*本质:求任意两点之间距离的最短值。时间复杂度为O(N^3),空间复杂度为O(N^2)问题:每组数据第一行是两个整数N,M(N<=100,M<=10000),N比哦啊是路口,标号为1的路口时商店所在地,标号为N的路口时赛场所在地,M表示有几条路,N=M=0表示输入结束,接下来M行,每行包括3个整数,A,B,C(1<=A,B<=N,1<=C<=1000),表示在路口A与路口B之间有一条路,要原创 2015-08-01 14:23:50 · 580 阅读 · 0 评论 -
机试算法讲解: 第9题 找x
/*问题:输入一个数n,输入n个数值不同的数,输入给定值x,输出x在数组中的下标,从0开始,若不在数组中则输出-1输入:21 30输出:-1思路:用哨兵,从后向前搜索参考: 计算机考研--机试指南*/#include <stdio.h>#include <stdlib.h>#include <memory.h>int ma...原创 2019-07-30 08:57:46 · 158 阅读 · 0 评论 -
机试算法讲解: 第8题 叠筐
/*问题:叠框问题int scafn(const char* format),成功:返回赋值的变量个数,失败:EOF比较复杂。待补充参考: 计算机考研--机试指南*/原创 2019-07-30 08:55:29 · 278 阅读 · 0 评论 -
机试算法讲解: 第7题 输出梯形
/*问题:输入高度h,输出高为h,上底边围h的梯形 ------------ -------------- ---------------- ------------------ --------------------思路:由于多出的底边x可以设为任意值,不放设x=h第1行, h h第2行,打印h-1个空格,1个*,然后打...原创 2019-07-30 08:53:21 · 190 阅读 · 0 评论 -
机试算法讲解: 第3题 日期差值
/*问题:求两个日志的相差天数,连续2天默认为一天。日期形式:YYYYMMDD输入:2011041220110422输出:11思路:方法1:将2个日期都应该化为绝对秒数,然后相减,用绝对秒数之差然后除以24*3600即可易错点:time_t mktime(struct tm* tmptr)double difftime(time_t time1,time_t time2)...原创 2019-07-30 08:50:53 · 150 阅读 · 0 评论 -
机试算法讲解: 第42题 广度优先搜索之我该如何倒可乐
/*问题:要用N,M,S三个杯子均匀分出2杯可乐,S=N+M,00,M>0。如果能够评分,请输出倒出可乐的最少次数,如果不能输出"NO"输入:3个整数,S 可乐的体积,N和M是两个杯子的容量,以"0 0 0"结束输出:若可以平分,输出最少要倒的次数,否则输出NO输入:7 4 34 1 30 0 0输出:NO3思路:用四元组(x,y,z,t)表示一个状态,x,y,z表示3个瓶原创 2015-08-01 14:37:29 · 1375 阅读 · 0 评论 -
机试算法讲解: 第56题 多重背包之一起支援灾区
/*多重背包:介于0-1背包和完全背包之间。容积为V的背包,给定一些物品,每种物品包含体积w,价值v和数量k,求用该背包能装下的最大价值总量。 每种武平可选的数量不再为无穷或者1,而是一个确定的数k。将多重转换为0-1背包。即每种物品被视为k种不同物品,对所有物品求0-1背包。 将原数量为k的物品拆分为若干组,每组物品包含的原物品个数分别为:1,2,4,...,k-2的c原创 2015-08-02 00:03:35 · 597 阅读 · 0 评论 -
机试算法讲解: 第52题 动态规划之搬寝室问题
/*动态规划题的思路:设定dp[i],dp[i][j]等数字量进行求解,这个数字量就称为:状态。 状态:含义:是秒数当前状况的一个数字量。 特点:是数字,保存在内存中,可以表示一个状态的特征,不需要辅助信息。最重要:状态间的转移依赖于状态本身。 dp(dynamic plan,动态规划) 关键:寻找一个好的状态 状原创 2015-08-01 14:59:58 · 1044 阅读 · 0 评论 -
机试算法讲解:第50题 动态规划之拦截导弹
/*问题:拦截导弹。导弹系统有缺陷,后面炮弹高度<=前一发高度。计算系统能拦截多少导弹。拦截时,必须按照时间顺序,不允许先拦截后面的导弹再拦截前面的导弹。输入:每组输入两行。第一行:导弹数量k(k<=25)。第二行:k个整数,表示第k枚导弹的高度,按时间顺序,空格分隔输出:每组输出一行,包含一个整数,表示能拦截多少导弹。输入:8300 207 155 300 299 170 158 6原创 2015-08-01 14:55:33 · 4730 阅读 · 0 评论 -
机试算法讲解: 第46题 深度优先搜索之能否逃出魔掌
/*DFS:主要用于求解有或者没有的问题,用栈。而BFS:用于求解最优问题,用队列。问题:有一个N*M的迷宫,起点S,终点D,墙X和地面,'.'表示路,0秒时,我从S出发,每秒能走到4个与其相邻位置的任意一个,行走之后不能再次走入。问:是否存在一条路径使主人公刚好在 T秒走到D确定状态:(x,y,t),x与y是当前点坐标,t为从起点走到该点所需要的时间。剪枝依据:起点坐标和的奇原创 2015-08-01 14:46:46 · 552 阅读 · 0 评论 -
机试算法讲解: 第44题 深度优先搜索之素数环问题
/*问题:在给定的1到n的数字中,将数字填入环中,使得环中任意2个相邻的数字和为素数。按字典序输出所有符合条件的解回溯法:枚举每一个值,第一个放1时,尝试放入第二个数字,使其和1的和为素数,放入后再尝试第三个数,使其与第二个数的和为素数。直到所有数被全部放入环中, 且最后一个数与1的和也是素数。 若发现当前位置无论放置任何之前未被使用的数均不能满足条件,回溯改变上一个数。原创 2015-08-01 14:42:16 · 1126 阅读 · 0 评论 -
机试算法讲解: 第43题 递归之汉诺塔问题
/*递归:设置递归出口,每次递归调用时函数的参数减1,每一个函数在等待递归函数返回时,将其返回值与本函数的参数相乘后返回给上一层函数。 递归2要素:1递归方式,2递归出口问题:汉诺塔,左,中,右3个盘,每次从两边互相移动时,必须经过中间的杆子,而且大盘不能在小盘上面。现在有N个圆盘,最多需要多少次输入:N(1<=N<=35)输出:输出移动最小的次数输入:1312输出:原创 2015-08-01 14:40:21 · 942 阅读 · 0 评论 -
机试算法讲解: 第40题 暴力搜索之百鸡问题
/*知识:搜索。最简单的搜索方式:枚举,注意时间复杂度。 查找3要素:1查找空间:所有的解,2查找目标:一组解,3查找方式:枚举原始问题:<=n元买100只鸡,大鸡5元每只,小鸡3元每只,还有1/3元每只的小鸡,分别记为x只,y只,z只,求所有解输入:输入n输出:对于每组输入,输出x y z ,按照x,y,z依次增大顺序输出输入:40输出:x=0,y=0,z=100x=原创 2015-08-01 14:34:45 · 793 阅读 · 0 评论 -
机试算法讲解: 第51题 动态规划之最长公共子序列问题
/*LCS:最长公共子序列。字符串S中按照先后顺序依次取出若干字符,并将它们排列成一个新的字符串,这个字符串就称为原字符串的子串。有2个字符串S1和S2,求字符串S3同时为S1 和S2的子串,且要求它的长度最长,确定这个长度。思路:dp[i][j]表示S1中前i个字符与S2中的前j个字符分别组成的两个前缀字符串的最长公共子串长度,当i.j较小时,dp[0][j]=0。假设已经求得dp[原创 2015-08-01 14:57:58 · 1044 阅读 · 0 评论 -
机试算法讲解:第47题 递推之N阶楼梯如何上楼
/*递推求解:确定几个规模较小的答案,考虑如何由规模较小的问题的答案推出后面的答案问题:N阶楼梯上楼问题:一次可以走两阶或者一阶,问有多少种上楼方式(要求采用非递归)输入:一个整数N(1<=N<90)输出:输出阶数为N时的上楼方式的个数输入:4输出:5思路:当n>2时,最后一步的行走方式可能:1)走到N-1阶台阶,走一步形成,上楼方式与原问题中到达n-1阶方式数量相同为F[n-原创 2015-08-01 14:48:46 · 1146 阅读 · 0 评论 -
机试算法讲解: 第4题 某一天是星期几?
/*问题:算出一天是星期几思路:找到一个基点,1970年1月1日是星期几,在此基础上算出新日期和旧日期相差多少天,再除以7即可例如19700101是星期1,那么19700108与之相差8-1=7天 [1+7]%7 = 1即为星期一,[1+6]%7=0->转换为星期天 若为1969年12月31日,相差-1天,[1 + (-1)]%7 = 0->认为是星期天,19891230,相差2天,[1原创 2015-07-30 23:27:01 · 1157 阅读 · 0 评论 -
机试算法讲解: 第15题 霍夫曼树是啥树啊?
/*问题:霍夫曼树输入:第一行,输入一个数n,为叶节点个数,节点有权值weight输出:所有节点的值与权值的乘积之和,2<=1000,weight<=100输入:51 2 2 5 9输出:37思路:K个节点K>=2,每次取最小值和次最小值,构成新节点,再放入K=1,该节点为根节点,结束循环关键:1使用小顶堆,用priority_queue,qreater >Q,以前原创 2015-07-31 00:05:48 · 569 阅读 · 0 评论 -
机试算法讲解: 第10题 让我们来查询学生的信息
/*问题:输入N个学生的信息,进行查询输入:401 李江 男 2102 刘唐 男 2303 张军 男 1904 王娜 女 1950203010403输出:02 刘唐 男 2303 张军 男 1901 李江 男 2104 王娜 女 1903 张军 男 19N;学生个数,<=1000,M,查询M次,M<=10000时间复杂度:普通搜索:O(n*m) =原创 2015-07-30 23:50:41 · 590 阅读 · 0 评论 -
机试算法讲解:第1题 冒泡排序与快速排序
#include #include //rand()#include #include using namespace std;//自定义降序函数//templatebool compare(int x,int y){ return x > y;}/*样例输入:41 4 3 2101 9 8 5 6 3 4 2 0 729 8,31,60,33,17,原创 2015-07-30 23:11:18 · 735 阅读 · 0 评论 -
机试算法讲解:第31题 大整数的M进制转N进制
/*将M进制的数X转换为N进制的数输出,2<=M,N<=36,输入时字母部分为大写,输出时为小写,并且有大数据输入:16(M进制) 10(N进制)F(待转换的数)输出:15*/#include #include #include typedef struct BigInterger{ int _digit[1000]; int _size; void init();原创 2015-07-31 00:54:31 · 968 阅读 · 1 评论 -
机试算法讲解: 第18题 大家一起猜,这两个序列是同一个二叉搜索树的序列码?
/*问题:二叉搜索树。判断2个序列是否为同一个二叉搜索树序列输入:开始一个数n,(1<=n<=20)表示有n个需要判断,n = 0输入结束。接下去一行是一个序列,序列茬高度小于10,包含(0-9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树接下去去n行有n个序列,每个序列格式跟第一个序列一样,请判断2个序列是否能组成同一颗二叉搜索树输出:如果序列相同,则输出YES,否则原创 2015-07-31 00:23:39 · 1171 阅读 · 0 评论 -
机试算法讲解: 第12题 贪心之我该如何选择:跑男,爸爸去哪儿,好声音,极限挑战
/*题目:尽可能看多的电视节目,时间为整点输入:第一行一个整数n为喜欢看电视的节目总数,下面有n行数据,每一行数据包含2个数据Ti_s,Ti_e表示第i个节目的开始和结束时间n=0表示输入结束,不做处理输出:能看到电视节目的个数输入:121 33 40 73 815 1915 2010 158 186 125 104 142 90排序:下标:0原创 2015-07-30 23:58:34 · 1028 阅读 · 0 评论 -
机试算法讲解: 第11题 贪心之猫鼠大战
/* 贪心算法问题:M磅猫粮,N个房间,第i个房间放着J[i]的老鼠粮食,需要F[i]磅猫粮给猫来看守,如果给予猫粮:F[i]*a%,则可获得J[i]*a%的老鼠粮食输入:第一行:非负整数 M N,接下来又N行,每一行含有1个非负整数 J[i] F[i]最后一组测试用例为:-1 -1所有的整数 <= 1000对每一行输出:打印出单独的一行,一个经过计算的实数(保留3位小数),老鼠能原创 2015-07-30 23:55:33 · 1138 阅读 · 0 评论 -
机试算法讲解:第30题 大整数的阶乘
/*问题:输入一个正整数,输出N的阶乘。本质:高精度乘法:将要乘的小数乘以高精度整数的每一位数并加上来自低位的仅为输入:正整数N(0<=N<=1000)输出:可能包括多组数据,对于每一组输入数据,输出N的阶乘输入:4515输出:241201307674368000关键:1 利用printf("%04d",n)表示输出总位数为4位,当不足4位时,补充02 重载乘号时,注原创 2015-07-31 00:51:17 · 592 阅读 · 0 评论 -
机试算法讲解:第29题 我也能做高精度整数的加法器,噢耶
/*问题:高精度整数。实现一个加法器,使其能够输出a+b的值输入:两个数a和b,其中a和b的位数不超过1000位输出:多组测试数据,每组数据,输出a+b的值输入:2 61000 0000 0000 0000 0000 1000 0000 0000 0000 0000 0000 0000 000099999999 1输出81000 0000 0000原创 2015-07-31 00:48:38 · 807 阅读 · 0 评论