C++学习日志
文章平均质量分 57
C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。
TOP-SECRET
这个作者很懒,什么都没留下…
展开
-
C++贪心算法之删数问题
删数问题题目描述思路分析代码实现#includeusing namespace std;string n; //定义字符串nint s;main(){ cin>>n>>s; int len=n.size(); //也可以用n.length()来取字符串n的长度 while(s--) for(int i=0;i<len;i+原创 2017-08-18 13:03:07 · 6207 阅读 · 2 评论 -
C++贪心算法之最小新整数
最小新整数Description给定一个十进制正整数n(0 现在从m位中删除k位(0例如: n = 9128456, k = 2, 则生成的新整数最小为12456Input第一行t, 表示有t组数据;接下来t行,每一行表示一组测试数据,每组测试数据包含两个数字n, k。Outputt行,每行一个数字,表示从n中删除k位后得到的最小整数。Sampl原创 2017-08-18 13:21:23 · 5051 阅读 · 1 评论 -
C++贪心算法之乘船问题
乘船问题描述进行一次独木舟的旅行活动,独木舟可以在港口租到,并且之间没有区别。一条独木舟最多只能乘坐两个人,且乘客的总重量不能超过独木舟的最大承载量。我们要尽量减少这次活动中的花销,所以要找出可以安置所有旅客的最少的独木舟条数。现在请写一个程序,读入独木舟的最大承载量、旅客数目和每位旅客的重量。根据给出的规则,计算要安置所有旅客必须的最少的独木舟条数,并输出结果。输入原创 2017-08-18 13:49:00 · 4530 阅读 · 0 评论 -
C++贪心算法之均分纸牌
均分纸牌题目描述有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若于张纸牌,然后移动。移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。原创 2017-08-18 17:10:15 · 8464 阅读 · 5 评论 -
C++贪心算法之装箱问题
装箱问题Description一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6。这些产品通常使用一个 6*6*h 的长方体包裹包装然后邮寄给客户。因为邮费很贵,所以工厂要想方设法的减小每个订单运送时的包裹数量。他们很需要有一个好的程序帮他们解决这个问题从而节省费用。现在这个程序由你原创 2017-08-19 12:15:36 · 9840 阅读 · 0 评论 -
C++记忆化搜索算法与动态规划算法之公共子序列
公共子序列Description我们称序列Z = 1, z2, ..., zk >是序列X = 1, x2, ..., xm >的子序列当且仅当存在 严格上升 的序列< i1, i2, ..., ik >,使得对j = 1, 2, ... ,k, 有xij = zj。比如Z = 是X = 的子序列。现在给出两个序列X和Y,你的任务是找到X和Y的最大公共子序列,也就是说要找原创 2017-07-10 16:06:13 · 1844 阅读 · 0 评论 -
C++动态规划算法之数字金字塔【USACO TRAINING】:一道经典的数塔问题
数字金字塔题目描述考虑在下面被显示的数字金字塔。 写一个程序来计算从最高点开始在底部任意处结束的路径经过数字的和的最大。每一步可以走到左下方的点也可以到达右下方的点。在上面的样例中, 从7到3到8到7到5的路径产生了最大和:30输入第1行:1个整数R(1接下来共R行,第i行有i个整数。所有的数均非负的且不大于100。原创 2017-08-21 16:19:23 · 6983 阅读 · 2 评论 -
C++动态规划算法之采药
采药Description辰辰是个很有潜能、天资聪颖的孩子,他的梦想是称为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到原创 2017-07-10 12:04:22 · 2061 阅读 · 0 评论 -
C++动态规划算法之Maximum sum(最大和)
Maximum sum(最大和)DescriptionGiven a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: t1 t2 d(A) = max{ ∑ai + ∑aj | 1 <= s1 <= t1 <原创 2017-07-11 11:36:58 · 4515 阅读 · 0 评论 -
最短编辑距离
1.最短编辑距离的介绍①基本定义 所谓编辑距离(Edit Distance),是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作总共有三个:将一个字符替换成另一个字符、插入一个字符或者删除一个字符。讲道理的话,编辑距离越小,两个字符串就越相似。对了,它又叫作Levenshtein距离,因为这个概念是在1965年由俄罗斯科学家Vladimir L原创 2017-07-12 17:59:35 · 2400 阅读 · 3 评论 -
曼哈顿距离与欧氏距离
定义曼哈顿距离对于一个具有正南正北正东正西方向规则布局的地图来说,从一点到达另一点的距离正是在南北方向上移动的距离加上在东西方向上移动的距离,因此,曼哈顿距离又称为出租车距离。简称为:两个点在标准坐标系上的绝对轴距总和。也就是说曼哈顿距离指的就是从一个点沿着东南西北(即沿着横轴纵轴)移动到另一个点的最短路径长度。如图,这是从点A到点B的两条曼哈顿距离:原创 2017-07-15 16:31:50 · 3329 阅读 · 0 评论 -
C++递推算法之放苹果
放苹果:把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。#includeint main(){ int i,j,k,n,m; int t; scanf("%d",&t); for(int o=1;o<=t;o++) { int f[101][101]; scanf("%d%d",&m原创 2017-05-26 13:06:00 · 5278 阅读 · 0 评论 -
C++递归算法之放苹果
Description把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法。Input第一行是测试数据的数目t(0 Output对输入的每组数据M和N,用一行输出相应的K。Sample Input17 3Sample Output8#includeint main(){ int i,j,k原创 2017-05-28 15:33:03 · 1807 阅读 · 0 评论 -
C++递归算法之分成互质组
-分成互质组-Description给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?Input第一行是一个正整数n。1 。第二行是n个不大于10000的正整数。Output一个正整数,即最少需要的组数。Sample Input614 20 33 117 143 175Sample Out原创 2017-07-09 09:23:16 · 3870 阅读 · 2 评论 -
C++递归递推算法之三角形划分平面区域
三角形划分平面区域Description1个三角形将平面划分成内、外 2 个区域。2 个三角形最多将平面划分成 8个区域,如下图所示。给定三角形数量 n,求 n 个三角形最多将平面划分成多少个区域。Input第1行:1个整数n(0Output第1行:1个整数,表示最多划分的平面区域数量Hint0思路解析原创 2017-07-15 12:01:25 · 1331 阅读 · 0 评论 -
C++搜索算法和曼哈顿距离之最少连通代价
最少联通代价Description在一个N行M列的字符网格上,恰好有 2 个彼此分开的连通块。每个连通 块的一个格点与它的上、下、左、右的格子连通。如下图所示:现在要把这 2 个连通块连通,求最少需要把几个’.’转变成’X’。上图的例子中, 最少只需要把 3 个’.’转变成’X’。下图用’*’表示转化为’X’的格点。Input第1行:2个整数原创 2017-07-15 11:30:56 · 2445 阅读 · 0 评论 -
C++高精度算法之比大小
比大小描述给你两个很大的正数,你能不能判断出他们两个数的大小呢?比如123456789123456789要大于123456789输入每组数据占一行,输入两个不超过1000位的10进制整数a,b数据保证输入的a,b没有前缀的0如果输入0 0表示输入结束。测试数据组数不超过10组输出如果a>b则输出“a>b”,如果a原创 2017-06-08 13:50:21 · 5994 阅读 · 4 评论 -
C++高精度算法之高精度减法
高精度减法题目描述高精度减法输入两个整数a,b(第二个可能比第一个大)输出结果(是负数要输出负号)样例输入21样例输出1说明20%数据a,b在long long范围内100%数据0题目解析样例解析: 2-1 1思路分析首先我们要定义两个字原创 2017-06-09 18:02:42 · 11154 阅读 · 2 评论 -
C++高精度算法之高精度加法
高精度加法题目描述:高精度加法输入:两个自然数a,b输出:结果样例输入:1 1原创 2017-06-04 09:26:50 · 2888 阅读 · 0 评论 -
C++二分查找算法之跳石头
跳石头题目描述输入输出样例输入25 5 2211141721样例输出4提示代码如下:#includeint l,r,L,M,N,a[500005],tot,mid,left;int main(){ scanf("%d %d %d",&L,&N,&M); r=a[N+1]=原创 2017-06-14 13:44:17 · 2114 阅读 · 0 评论 -
C++动态规划算法之子集的和
子集的和题目描述对于从1到N (1 举个例子,如果N=3,对于{1,2,3}能划分成两个子集合,他们每个的所有数字和是相等的:{3} and {1,2} 这是唯一一种分法(交换集合位置被认为是同一种划分方案,因此不会增加划分方案总数)如果N=7,有四种方法能划分集合{1,2,3,4,5,6,7},每一种分发的子集合各数字和是相等的:{1,6,7} 和 {2,3,原创 2017-06-16 13:23:43 · 1949 阅读 · 0 评论 -
C、C++基础知识
C/C++头文件一览C、传统 C++#include //设定插入点#include //字符处理#include //定义错误码#include //浮点数处理#include //文件输入/输出#include //参数化输入/输出#include //数据流输入/输出#include //定转载 2017-06-03 09:42:02 · 656 阅读 · 0 评论 -
C++基础之论指针的正确打开方式
论指针的正确打开方式指针:所谓指针,顾名思义,就是指利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。我们会想,如何用指针输出一个数的值呢?是不是可以直接输呢?不是怎么可以见分晓。程序如下:#includeusing namespace std;int main(){ int a=1,*b; b=&a; //让b指向a c原创 2017-06-14 22:58:02 · 1645 阅读 · 0 评论 -
C++广度优先搜索算法之走迷宫
走迷宫 题目描述 一个网格迷宫由n行m列的单元格组成,每个单元格要么是空地(用1表示),要么是障碍物(用0表示)。你的任务是找一条从起点到终点的最短移动序列。用U、D、L、R分别表示往上、下、左、右移动到相邻单元格。不能走到障碍物上,也不能走出迷宫。起点和终点保证是空地,保证从起点到终点一定存在至少一条路径。输入第1行:2个整数n和m,分别表示行数和列数(n,m <=100)原创 2017-06-13 22:42:28 · 5937 阅读 · 0 评论 -
C++动态规划算法之最长上升子序列
最长上升子序列Description一个数的序列bi,当b1 b2 bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1,a2, ..., aN),我们可以得到一些上升的子序列(ai1,ai2, ...,aiK),这里1 <=i1 i2 < ... <iK 你的任务,就是对于给定的序列,求出最长上升子序列的长度。Input输入的第一行原创 2017-06-11 22:35:11 · 2027 阅读 · 0 评论 -
C++广度优先搜索算法之抓住那头牛(Catch that cow)
抓住那头牛:农夫知道一头牛的位置,想要抓住它。农夫和牛都位于数轴上,农夫起始位于点N(01、从X移动到X-1或X+1,每次移动花费一分钟2、从X移动到2*X,每次移动花费一分钟假设牛没有意识到农夫的行动,站在原地不动。农夫最少要花多少时间才能抓住牛?Catch that cow:Farmer John has been informed of the location of原创 2017-05-27 18:09:06 · 6541 阅读 · 0 评论 -
C++递归算法之菲波拉契数列
菲波拉契数列:菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数是多少。代码如下:#includeint a;int fibonacci(int x) //递归函数{ if(x==1||x==2) return 1; //满足边界条件,递归返回 else return fibonacc原创 2017-05-22 06:14:36 · 1525 阅读 · 0 评论 -
C++递推算法之菲波拉契数列
菲波那契数列:菲波那契数列是指这样的数列: 数列的第一个和第二个数都为1,接下来每个数都等于前面2个数之和。给出一个正整数a,要求菲波那契数列中第a个数是多少。代码如下:#includeusing namespace std;int a,b[1000005]={0,1,1};int main(){ cin>>a; for(int j=3;j<=a;j++) b[原创 2017-05-25 13:39:51 · 1985 阅读 · 0 评论 -
C++搜索与回溯算法之全排列问题
全排列问题:设有n个整数的集合{1,2,…,n},从中任意取出r个数进行排列(r),试列出所有的排列。可以用枚举,就像这样(当r=5时): #includeint n,i[5],r=5;bool mark(int x[],int y){ for(int j=0;j<y-1;j++) for(int k=j+1;k<y;k++) if(x[j]==x[k]) r原创 2017-05-21 22:08:36 · 6375 阅读 · 0 评论 -
C++搜索与回溯算法之素数环问题
素数环问题:从1到n(n代码如下:#include#includeint n;int num[10001]; //存储数据bool mark[10001]; //判断该数是否被标记过bool check(int x,int y) //判断是否满足"素数环"条件{ int k=2,i=x+y; while(k<=sqrt(i)&&i%k!=0) k++;原创 2017-05-22 22:11:41 · 6121 阅读 · 2 评论 -
C++搜索与回溯算法之迷宫问题
迷宫问题:一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走,用'#'表示;有的格子是空地,可以走,用'.'表示;。给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到)。只能在水平方向或垂直方向走,不能斜着走。输入R、C和迷宫,输出所有路径。代码如下:原创 2017-05-23 06:14:11 · 3179 阅读 · 1 评论 -
C++搜索与回溯算法之移动问题
桌子上有一个r行c列的方格矩阵,将每个方格用坐标表示,行坐标从下到上依次递增,列坐标从左至右依次递增,左下角方格的坐标为(1,1),则右上角方格的坐标为(r,c)。小明是个调皮的孩子,一天他捉来一只蚂蚁,不小心把蚂蚁的右脚弄伤了,于是蚂蚁只能向上或向右移动。小明把这只蚂蚁放在左下角的方格中,蚂蚁从左下角的方格中移动到右上角的方格中,每步移动一个方格。蚂蚁始终在方格矩阵内移动,请计算出不同的原创 2017-05-26 13:16:18 · 1274 阅读 · 0 评论 -
C++搜索与回溯算法之八皇后问题
八皇后问题:在国际象棋棋盘上放置八个皇后,要求每两个皇后之间不能直接吃掉对方。输出所有的解。代码如下:#includeusing namespace std;int b[10]={0},c[20]={0},d[20]={0},a[10][10]={0};int t=0;void print(){ t++; printf("No. %d\n",t); for (int i =原创 2017-05-27 18:40:45 · 1772 阅读 · 3 评论 -
C++搜索与回溯算法之拆数
版本一:题目描述输入自然数N,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。输入第1行:1个整数n(n≤30)输出所以拆分方案,顺序见样例。样例输入4样例输出3+12+22+1+11+1+1+1代码如下:#include #include int num[40],to原创 2017-05-28 14:28:26 · 2646 阅读 · 0 评论 -
C++基础之三目运算符
三目运算符三目运算符,计算机语言的重要组成部分。条件运算符是唯一有3个操作数的运算符,所以有时又称为三元运算符。用一个简单的程序来表示,输入x,若x==0,输出NO,否则输出YES。这里是使用单目运算符的程序:#includeusing namespace std;int main(){ int x; cin>>x; if(!x) cout<<"NO"; else原创 2017-05-27 21:09:34 · 962 阅读 · 0 评论 -
C++排序算法之桶排序
桶排序的思想是把记录的数放在某个有限范围内(整型)内,然后顺序输出,但耗费空间较大,且一个值不能出现两次。代码如下(从小到大):#includebool num[10000]={false}; //装数的"桶" 范围:0-9999 int n,k; //数的个数n和临时存储数的kint main(){ scanf("%d",&n); for(int i=0;i<n;i+原创 2017-05-20 17:32:58 · 1482 阅读 · 0 评论 -
C++排序算法之选择排序
选择排序:把每一个位置(除最后一个位置)的数与后面的数进行比较,满足条件便交换,来一个一个确定位置。代码如下(从小到大):#includeint main(){ int n; //数的个数 int num[10000]; //排序范围:最多10000个数 scanf("%d",&n); for(int i=0;i<n;i++) //输入每个数 scanf("%d",&num原创 2017-05-20 20:46:23 · 455 阅读 · 0 评论 -
C++排序算法之冒泡排序
冒泡排序:顾名思义,它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来,就像冒泡泡一样。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。代码如下(从大到小):#includeint main(){ int n; //数的个数 int num[10000]; //排序范围:最多10000个数 scanf("%d",&n);原创 2017-05-20 21:52:50 · 403 阅读 · 0 评论 -
C++排序算法之插入排序
插入算法:把要排序的数组分成两部分:第一部分包含了这个数组的所有元素,但将最后一个元素除外(让数组多一个空间才有插入的位置),而第二部分就只包含这一个元素(即待插入元素)。在第一部分排序完成后,再将这个最后元素插入到已排好序的第一部分中。代码如下(从小到大):#include#includeint main(){ int n,num[10000]; //定义数组 scanf(原创 2017-05-21 09:06:39 · 552 阅读 · 0 评论 -
C++排序算法之快速排序
快速排序:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。代码如下(从小到大):#includeint n,num[10000];void qsort(int left,int right) //快速排序{ int i,j,midd原创 2017-05-21 12:57:58 · 473 阅读 · 0 评论