算法
大学毕业在即,结合王道计算机机试一书对常见的较经典的C程序编程做一个简单的总结,也算是对大学C学习做一个回顾,也希望能够帮到一些初学c编程的人。主要涉及数据结构,数学问题,搜索,图论和动态规划中的一些知识。另专栏文章虽标记为原创,但内容在王道学得。
Joanna_or_zhouzhou
这个作者很懒,什么都没留下…
展开
-
C数据结构之栈的应用:括号匹配和简单计算器
用C语言编程实现括号匹配和表达式求值,以九度OJ中的括号匹配和简单计算器两个例子来熟悉数据结构中堆栈的应用。原创 2018-05-17 11:31:12 · 1123 阅读 · 0 评论 -
C 数据结构之哈夫曼树
3.哈夫曼树,第一行输入一个数n,表示叶节点的个数。需要用这些叶节点生成哈夫曼树。这些节点有权值,即weight,题目需要输出所有节点的值与权值的乘积之和。输出权值51 2 2 5 937思路:将所有节点放入集合K,若K中剩余节点大于2,则取出最小的两个节点,构造他们同时为某个节点的左右子节点,则该新节点的权值为左右儿子节点权值之和,并将该节点放入集合K。若集合K只余一个节点,则该节点为哈夫曼树的...原创 2018-05-17 11:53:24 · 832 阅读 · 0 评论 -
C 数据结构之二叉树的遍历
二叉树的遍历//根据前序中序遍历确定后序遍历,输入:两个字符串,长度n小于等于26。第一行前序,第二行中序,节点以大写字母命名,输出后序遍历字符串/*输入ABC BAC 输出BCA输入FDXEAG XDEFAG 输出XEDGAF该例设计二叉树的建立,两种二叉树遍历结果还原二叉树 。 */ //多输出一个空格 思路:该例子设计二叉树的建立,由两种二叉树的遍历结果还原二叉树以及二叉树的遍历。由前序遍历...原创 2018-05-17 12:13:03 · 194 阅读 · 0 评论 -
C 数据结构之二叉排序树
本节对数据结构中二叉树的排序插入,根据遍历序列还原二叉树,判断二叉树是否为同一个搜索二叉树进行了练习。//输入一串整数,建立二叉排序树,并进行前序、中序、后序遍历 /*输入第一行包括 一个整数n,接下来一行包括n个整数样例输入 51 6 5 9 8样例输出1 6 5 9 81 5 6 8 95 8 9 6 1对二叉树插入数字 x,1,若当前树为空,其为根节点。2.若当前节点大于x,插入左子树,小于...原创 2018-05-17 12:23:19 · 566 阅读 · 0 评论 -
C 数据结构之%运算符的应用:数位拆解和进制转换
%运算:r=a%b,即a=k*b+r。其中k为某整数,r的绝对值范围为[0,b-1],其符号与a保持一致,除非其为0.(a*b)%c=(a%c*b%c)%c (a+b)%c=(a%c+b%c)%c数位拆解是把一个给定数字各个数位上的数字拆开。特殊乘法:对2个小于1000000000的输入,求结果。123*45=1*4+1*5+2*4+2*5+3*4+3*5 样例输入:123 45 样例输出...原创 2018-05-17 18:15:32 · 545 阅读 · 0 评论 -
C 数据结构之最大公约数最小公倍数
最大公约数:若整数g为整数a,b的公约数,则g满足 a=g*l; b=g*m; 其中l ,m为整数。a=b*k+r。k为整数,r为a除以b后的余数。则g*l=g*m*k+r, r=g*(l-m*k);(g!=0)因此,a,b的公约数可以整除a除以b剩余的余数,即a mod b。即a,b的公约数也是a mod b的公约数。若g是a,b的最大公约数,则g也是a,a mod b的最大公约数。1.输入两...原创 2018-05-17 18:53:45 · 251 阅读 · 0 评论 -
C 数据结构之素数筛法
1.数判定:给定一个整数n,要求判断其是否为素数,若是输出YES,否则输出NO 如:13 YES。若n存在相异于1与其本身的因数且该因数大于sprt(n),则必存在小于或等于sprt(n)的因数。所以对于素数测试,只需到sprt(n)。 #include<stdio.h>#include<math.h>bool judgo(int x)//判断一个数是否为素数 { ...原创 2018-05-18 11:21:14 · 449 阅读 · 0 评论 -
C 数据结构之分解素因数
1.分解质因数求正整数N的质因数的个数,相同的质因数需要重复计算。如 120=2*2*2*3*5。对于每组数据,输出N的质因数个数。样例输入:120 样例输出 5 (1不是N的质因数,若N为质数,则N是N的质因数) 思路:利用素数筛法预先筛选出所有可能成为给定数据范围内成为素因数的素数。依次遍历所有小于n的素数,判断其是否是n的因数。若是,则通过试除确定对应的幂指数。最后求出各个幂指数的和即为所...原创 2018-05-18 11:49:08 · 1254 阅读 · 0 评论 -
C 数据结构之二分求幂
求A^B的最后三位数表示的整数,0 0表示输入数据结束,不做处理。样例输入:2 312 66789 100000 0样例输出:8 984 1思路:分解a的b次方变为a的2^k次的积,并尽可能减少分解结果的个数。在指数层面即分解b为若干个2^k的和。分解b为若干个2^k的和且分解个数最少,即求b的2进制数。求得b的2进制后,各个二进制位为1的数位所代表的权重即为分解结果。二分求幂大大减少其...原创 2018-05-18 19:25:20 · 223 阅读 · 0 评论 -
C 数据结构之高精度整数
实现一个加法器。使其能够输出a+b的值输入包括两个数a和b,并且都不超过1000位,输出a+b的值样例输入:2 610000000000 1000000000000000 样例输出:81000010000000000 思路:定义一个结构体来保存一个高精度整数struct bigInteger{ int digit[1000]; int size;}digit数组保存大整数中每若干位数字...原创 2018-05-18 19:30:52 · 959 阅读 · 0 评论 -
C 数据结构之图论:并查集应用畅通工程
并查集1.畅通工程 使全省任何两个城市都能实现交通,城市之间不一定直接联通输入 第一行给出两个整数N城镇数目,道路数目 M,之后M行对应M条道路,输出最少还需建设城镇数目样例输入 4 21 34 33 31 21 32 35 21 23 5999 0样例输出 1 0 2 998 #include <stdio.h>using namespace std;#define N 1000...原创 2018-05-18 19:56:13 · 425 阅读 · 0 评论 -
C 数据结构之最小生成树:畅通工程和Freckles
使全省任何两个村庄都可以相互交通,不一定直接联通,求铺设公路总长度最短输入 第一行 村庄数目N 随后N(N-1)/2行对应村庄间的距离,每行3个整数,村庄编号和距离31 2 1 1 3 22 3 441 2 11 3 41 4 12 3 32 4 23 4 50输出 3 5 #include<stdio.h>#include<algorithm>using namesp...原创 2018-05-18 20:15:01 · 288 阅读 · 0 评论 -
C 数据结构之最短路径:Floyd和Dijstra实现最短路径
输入多组数据,每组第一行两个整数N大街上的路口数, M 表示有几条路标号为1的路口为起点,标号为N为的是终点。接下来M行每行有3个数A B C表示路口A路口B之间有一条路,用时C分钟。求到达的最短时间。输入样例2 11 2 33 31 2 52 3 53 1 2样例输出 3 2 #include<stdio.h>int ans[101][101]; //二维数组,初值为该图邻接矩阵 ...原创 2018-05-18 21:00:36 · 376 阅读 · 0 评论 -
C 数据结构之拓扑排序:Leagal or Not
A是B的师傅,B是C师父,C是A师父,判读图是否为有向无环图输入第一行M N,M人数,N表示关系数3 20 11 22 20 11 0输出 YES NO #include<stdio.h>#include<vector>#include<queue>using namespace std;vector<int> edge[501];queu...原创 2018-05-18 22:31:06 · 180 阅读 · 0 评论 -
C数据结构之广度优先搜索:胜利大逃亡和非常可乐
//ABC立方体,从0 0 0位置到A-1 B-1 C-1位置,用时小于等于T分钟 //输入K测试数据数量,A B C T,A块输入数据,每块输入数据有B行,每行有C个正整数/*样例输入13 3 4 20(A0块 行B 列Z) 0 1 1 10 0 1 10 1 1 11 1 1 1 (A1块) 1 0 0 10 1 1 10 0 0 00 1 1 00 1 1 0 *///样例输出11 0代表...原创 2018-05-19 10:52:23 · 238 阅读 · 0 评论 -
C 数据结构之递归:汉诺塔3、Prime ring problem和Oil Deposit
汉诺塔3 不允许小盘在大盘上,不允许直接从最右移向最左,或最左到最右,现有N盘,至少移动多少次输入 每次输入一个N 大于1小于351 3 12输出 2 6 531440 k个盘,将最底下的圆盘移到第三根柱上,首先将k-1个盘移动到第三盘,最大圆盘到第二柱。再次将k-1盘移动到第一盘,大盘移到第三柱,最后将k-1盘移动到第三盘。若将k盘从第一柱移动到第三需要F[k]次,那么F[k]等于移动3次k-...原创 2018-05-19 11:15:24 · 149 阅读 · 0 评论 -
C 数据结构之深度优先搜索:Temple of the bone
有一个N*M的迷宫,包括起点S,终点D,墙X和地面,0秒出发,每秒能走到4个相邻的位置中的一个每个位置被行走之后都不能在进入,问是否有一条路径T秒刚好走到D。输入4 4 5S.X...X...XD....3 4 5S.X...X....D000输出 NO YES判定是否存在而不是最优解适合深度搜索,当走过奇数步,其所在位置坐标和的奇偶性一定与原始位置不同,走过偶数步,奇偶性不变。深度搜索对状态的查...原创 2018-05-19 11:23:47 · 207 阅读 · 0 评论 -
C 动态规划之递推求解及最长公共子序列
N阶楼梯上楼问题,一次可以走两阶或一阶,问有多少种上楼方法输入包括一个整数N 如 4输出 上楼方式 5F[n]为台阶方式总数,F[1]=1,F[2]=2,当n大于2,每种上台阶方式最后一步有两种方式从n-1阶到n阶,其上楼方式为Fn-1,从n-2阶到n阶,上楼方式为Fn-2。所以Fn=Fn-1+Fn-2#include<stdio.h>long long F[91];int ma...原创 2018-05-19 11:41:51 · 375 阅读 · 0 评论 -
C动态规划之最长递增子序列
序列a1 a2 a3 an,求其最长递增子序列长度。用Fi表示以ai结尾的递增子序列长度当i较小时,f1=1。假设f1到fx的值都确定,以ax结尾的最长递增子序列长度依次比较ax与之前的所有ai(i<x)比较ai小于ax,则为Fi+1;当没有ai小于ax,长度为1。Fi={1,max{1,fj+1}|aj<ai&&j<i} 导弹拦截系统第一发炮弹可以任意高度,但以...原创 2018-05-19 11:53:04 · 721 阅读 · 1 评论 -
C 动态规划问题分析举例
搬寝室 有n间物品,搬2*k件物品。每搬一次的疲劳度是左手 和右手物品重量差的平方成正比,每次搬两件物品。输入 第一行有两个数 n 表示n件物品的总重量,k 。第二行有n个物品的重量2 11 3 输出 最少的疲劳度 4 #include<stdio.h>#include<algorithm>using namespace std;#define INF 0x7ffff...原创 2018-05-19 12:26:43 · 468 阅读 · 0 评论 -
C 背包问题之0-1背包
0-1背包特点 每件物品只能选择一件,即在背包中该物品数量只能为0 1有一个背包体积为V,有一些物品体积为w价值为v,求背包的装下物品的最大价值 采药 输入 第一行有两个整数T 总共采药时间 M 代表山洞里采药数目接下来M行包括两个整数,分别表示采摘某株药的时间和这株药的价值70 371 10069 11 2输出 可以采到的药的最大总价值 #include<stdio.h>#defi...原创 2018-05-19 13:07:04 · 249 阅读 · 0 评论 -
C 背包之完全背包及多重背包
有一个储蓄罐,告知其空时的重量和当前重量,并给定一些钱币的价值和相应重量求储蓄罐中最少有多少现金输入 第一行T 表示后面有T行测试用例第二行两个数字 空储蓄罐重量 当前储蓄罐重量第三行一个 整形N 其后有N行,每行有两个数字钱币价值和重量310 11021 130 5010 11021 150 301 6210 320 4输出60100this is impossible完全背包特点 每个物品可选...原创 2018-05-19 13:12:21 · 1351 阅读 · 1 评论