
Algorithm
文章平均质量分 70
nomasp
Android 工程师
展开
-
捕鱼分鱼、出售鱼、平分七筐鱼
1.有5个人大半夜地去捕鱼,到第二天响午才陆续醒来。第一个醒来的人将鱼分为5份,然后把多余的一条丢了……拿走了自己的一份。然后第二个人也将鱼分为5分,居然也把多余的一条给丢了……当然也不忘自己的一份。同样的,后面三个人也采用了相同的操作。那么他们至少捕了多少条鱼呢?令鱼的总数为X,则(X - 1)可被5整除,那么拿走自己的一份后剩下的鱼为(X - 1)* 4 / 5 。下面求出了10个最小的结果,第原创 2015-05-05 21:46:07 · 2841 阅读 · 0 评论 -
【算法】9 散列表【待补充】
上次写了四个多小时,但文章被荡掉了。暂时不想重写,先搁置下来,以后再补充。原创 2015-06-28 14:51:06 · 1723 阅读 · 2 评论 -
【算法】6 比较排序之外学习新的线性时间排序
回顾比较排序相信阅读过前面5篇博文的童鞋们已经发现了“在排序的最终结果中,各元素的次序依赖于它们之间的比较”。于是乎,这类排序算法被统称为”比较排序“。比较排序是通过一个单一且抽象的比较运算(比如“小于等于”)读取列表元素,而这个比较运算则决定了每两个元素中哪一个应该先出现在最终的排序列表中。声明:下面通过在维基百科中找到的非常完美的图示来介绍一系列比较排序。插入排序在该系列的【算法】1中我们便介绍原创 2015-06-11 12:36:30 · 6616 阅读 · 13 评论 -
【算法】3 由招聘问题看随机算法
招聘问题我想看我博客的还是学生人群偏多吧,本身很快就要去面试了,在这篇博客的问题中,我们就把自己当作Boss过把瘾。某天,你想雇用一名算法工程师。当然,不可能让你这个Boss亲自去到处练习应聘者,而是选择了中介。雇用中介每天都会给你推荐一个应聘者(PS:还是让自己轻松点,一天只应聘一个人哈)。是个地球人都知道,你必须要给中介付一小笔钱。然后如果你雇用了一个应聘者则需要更多的钱,一来你要解雇现有的算法原创 2015-05-29 22:22:00 · 5348 阅读 · 18 评论 -
【算法】7 分不清栈和队列?一张图给你完整体会
所谓“一图胜千言”,不知道我这张图能够胜几句话呢?今天又看到了“河内塔”的相关资料,也被称为“汉诺塔”等。于是就想到了画出下面这样的图案。原创 2015-06-20 16:07:55 · 4946 阅读 · 8 评论 -
【算法】8 图文搭配诠释三种链表及其哨兵
三种链表的介绍原谅我拙劣的绘图能力,花了半天终于还是决定从网上找来了这三张图,因为环形链表的弧形箭头难以完美的展现出来。以下3张图片来自Wikipedia。大家看着图片应该也都知道这分别是哪种链表了。那么链表到底是什么呢?它和前面的栈和队列一般,都是基本的数据结构,其中的各个对象按线性顺序排列。大家应该注意到了图中的大黑点,有些C/C++编程基础的同学肯定能够猜到链表是通过各个对象里的指针来指向下一原创 2015-06-28 15:17:30 · 6883 阅读 · 8 评论 -
某大学程序设计竞赛
这是博主学校今天举行的小比赛,校内的,主要用来蓝桥杯选拔。时间2个半小时,题目我也懒得在网上搜,是不是学校原创就不知道了,大家可以试试。我才解出6道……1、西岳华山上有一条长阶梯,若每步跨2阶,则最后剩一阶,若每步跨3 阶,则最后剩2阶,若每步跨5阶,则最后剩4阶,若每步跨6阶则最后剩5阶。只有每次跨7阶,最后才正好一阶不剩。请编程得出这条阶梯最少有多少阶?【输出】 输出这条阶梯最少的阶数。2、有原创 2015-06-06 14:53:38 · 3572 阅读 · 4 评论 -
斐波那契数(C/C++,Scheme)
一、背景斐波那契数的定义: f0=0 f_0 = 0 f1=1 f_1 = 1 fi=fi−1+fi−2(i>1) f_i = f_{i-1}+f_{i-2} (i > 1) 二、分析我引用两张表,大家一看便懂。1.递归(factorial 6)(* 6 (factorial 5))(* 6 (* 5 (factorial 4)))(* 6 (* 5 (* 4 (factorial原创 2015-05-25 21:50:52 · 3752 阅读 · 6 评论 -
【万字总结】图解堆算法、链表、栈与队列(多图预警)
堆算法什么是堆堆(heap),是一类特殊的数据结构的统称。它通常被看作一棵树的数组对象。在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小、但很重要的作业,同样应当拥有优先权。而堆就是为了解决此类问题而设计的数据结构。二叉堆是一种特殊的堆,二叉堆是完全二叉树或者近似完全二叉树,二叉堆满足堆特性:父节点的键值总是保持固原创 2015-12-18 08:40:12 · 22738 阅读 · 13 评论 -
【万字总结】探讨递归与迭代的区别与联系及如何求解10000的阶层
递归和迭代这两个概念也许很多童鞋依旧是老虎老鼠傻傻分不清楚,下面通过求解斐波那契数来看看它们俩的关系吧。斐波那契数的定义: f0=0 f_0 = 0 f1=1 f_1 = 1 fi=fi−1+fi−2(i>1) f_i = f_{i-1}+f_{i-2} (i > 1) 递归:(factorial 6)(* 6 (factorial 5))(* 6 (* 5 (factorial 4原创 2015-12-12 11:32:20 · 3576 阅读 · 2 评论 -
【万字总结】以插排和分治为例来看如何分析与设计算法
插入排序及其解决思路算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的。就像编程语言中的“Hello World!”程序一般,学习算法一开始学的便是排序算法。排序问题在日常生活中也是很常见的,说得专业点:输入是:n个数的一个序列<a1,a2,...,an−1,an><a_1,a_2,...,a_{n-1},a_n> 输出是:这n个数的一个全原创 2015-12-11 18:13:04 · 4154 阅读 · 3 评论 -
【万字总结】快速排序详解与各种线性时间排序对比
什么是快速排序快速排序简介快速排序(英文名:Quicksort,有时候也叫做划分交换排序)是一个高效的排序算法,由Tony Hoare在1959年发明(1961年公布)。当情况良好时,它可以比主要竞争对手的归并排序和堆排序快上大约两三倍。这是一个分治算法,而且它就在原地排序。所谓原地排序,就是指在原来的数据区域内进行重排,就像插入排序一般。而归并排序就不一样,它需要额外的空间来进行归并排序操作。为了原创 2015-12-19 21:27:43 · 5158 阅读 · 5 评论 -
【算法】1 由插入排序看如何分析和设计算法
插入排序及其解决思路算法的作用自然不用多说,无论是在校学生,还是已经工作多年,只要想在计算机这条道路走得更远,算法都是必不可少的。就像编程语言中的“Hello World!”程序一般,学习算法一开始学的便是排序算法。排序问题在日常生活中也是很常见的,说得专业点:输入是:n个数的一个序列<a1,a2,...,an−1,an><a_1,a_2,...,a_{n-1},a_n> 输出是:这n个数的一个全原创 2015-07-01 13:17:26 · 14103 阅读 · 13 评论 -
【算法】2 由股票收益问题再看分治算法和递归式
回顾分治算法分治算法的英文名叫做“divide and conquer”,它的意思是将一块领土分解为若干块小部分,然后一块块的占领征服,让它们彼此异化。这就是英国人的军事策略,但我们今天要看的是算法。如前所述,分治算法有3步,在上一篇中已有介绍,它们对应的英文名分别是:divide、conquer、combine。接下来我们通过多个小算法来深化对分治算法的理解。二分查找算法问题描述:在已排序的数组A原创 2015-05-27 18:48:43 · 9263 阅读 · 17 评论 -
【算法】4 五张图带你体会堆算法
什么是堆堆(heap),是一类特殊的数据结构的统称。它通常被看作一棵树的数组对象。在队列中,调度程序反复提取队列中的第一个作业并运行,因为实际情况中某些时间较短的任务却可能需要等待很长时间才能开始执行,或者某些不短小、但很重要的作业,同样应当拥有优先权。而堆就是为了解决此类问题而设计的数据结构。二叉堆是一种特殊的堆,二叉堆是完全二叉树或者近似完全二叉树,二叉堆满足堆特性:父节点的键值总是保持固定的序原创 2015-05-31 23:09:31 · 11475 阅读 · 29 评论 -
硬币问题
#include <cstdio>#include <iostream>using namespace std;const int V[6]={1,5,10,50,100,500};int C[6];int A;void solve(){ int ans=0; for(int i=5;i>=0;i--) { int t=min(A/V[i],C[i]);原创 2015-05-19 14:25:51 · 2400 阅读 · 0 评论 -
Fence Repair
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;#define MAX_N 2000typedef long long ll;int N,L[MAX_N];void solve(){ ll ans=0; while(N>1) { int mii1=0,原创 2015-05-19 15:55:49 · 2331 阅读 · 0 评论 -
抓交通肇事犯
一辆卡车违反交通规则,撞人后逃跑。现场有三人目击事件,但都没有记住车号,只记下车号的一些特征。甲说:牌照的前两位数字是相同的;乙说:牌照的后两位数字是相同的,但与前两位不同; 丙是数学家,他说:四位的车号刚好是一个整数的平方。请根据以上线索求出车号。#include<stdio.h>#include<math.h>int main(){ int i,j,k,c; for(i=1;原创 2015-05-05 20:42:57 · 3159 阅读 · 0 评论 -
存钱问题、利润最大问题
1.假设银行一年整存零取得月息为8.9%(纯属娱乐哈),现在你手里有一笔钱,你打算在今后的100年中的年底取出10000元,到第10000年刚好取完,请问你现在该存多少?和传统的数学题不一样,这里需要逆推来计算。第i年年初的存款=(第(i+1)年年初存款+10000)/(1+0.089*12)#include<stdio.h>int main(){ int i; float mon原创 2015-05-05 21:24:54 · 2740 阅读 · 0 评论 -
控制台绘制正切曲线
前面介绍了:控制台绘制正弦/余弦曲线 , 控制台绘制正弦曲线和余弦曲线同时显示下面来看看正切曲线吧,其实也都差不多……#include <stdio.h>#include <math.h>int main(){ double y; int x,k; for(y=10;y>=-10;y--) { k=atan(y)*7; if(k>0)原创 2015-04-30 12:53:06 · 2534 阅读 · 0 评论 -
控制台绘制正弦曲线和余弦曲线同时显示
看这一篇时如果不会绘制正弦/余弦曲线可以先看看这一篇哦:控制台绘制正弦/余弦曲线那么,如果想要同时显示的话,我们可能需要在同一行中绘制出3个或者4个点了。我的思路比较简略,不过算法看上去非常非常不整洁,还望得到大家的帮助……我通过Y等于二分之根号二和负二分之根号二以及Y轴将整个图形分成4层,从上往下依次绘制。具体看代码啦……#include <stdio.h>#include <math.h>in原创 2015-04-30 06:41:12 · 3561 阅读 · 5 评论 -
控制台绘制正弦/余弦曲线
余弦曲线当然了,这里我们不用数组……否则就没技术含量了。正弦曲线的特点是左右对称,且左边部分的纵坐标是从1一直降到-1的,相应的右边的纵坐标是从-1一直递增到1。难点在于显示器只能按行输出,也就是说输出了一行后不能再掉头输出上一行的信息。我们自定义一个缩放系数a为10,用acos(-1)*10可以算得等于31,因此总宽度为62,起点的横坐标为0,终点的横坐标为61。因为余弦曲线对称,所以在0~180原创 2015-04-30 05:32:40 · 4593 阅读 · 3 评论 -
字梯游戏(C++)
编写一个程序实现字梯游戏。其中,单字母替换的值为1,而单字母的删除或添加的值p>0(p值由使用者指定)。#include <iostream>#include <vector>#include <string>#include <fstream>#include <cmath>using namespace std;const int INFINTY = 99999;struct Verte原创 2015-05-10 20:01:11 · 2587 阅读 · 0 评论 -
杨辉三角形
在屏幕上打印出杨辉三角形。 1 1 1 1 2 1 1 3 3 1 1 4 6 4 11 5 10 10 5 1根据上图可以得到2个公式: 1)每行的第一个和最后一个为1 2)除上式得两个数外,其他数分别是上一行中的前一列和同一列的两数之和。#include<stdio.h>int add(int x,int y)原创 2015-05-05 20:25:40 · 2327 阅读 · 0 评论 -
背包问题
#include <cstdio>#include <iostream>using namespace std;#define MAX_N 100#define MAX_W 1000int n,W;// 从第i个物品开始挑选总重量小于j的部分int rec(int i,int j){ int res; if(i==n) res=0; // 已经没有剩余物品了原创 2015-05-19 16:47:07 · 2294 阅读 · 0 评论 -
霍纳规则(C/C++,Scheme)
一、背景霍纳(Horner)规则是采用最少的乘法运算策略,来求多项式 A(x)=anxn+an−1xn−1+...+a1x+a0 A(x) = a_n x^n + a_{n-1}x^{n-1} + ... + a_1 x + a_0 在x0处的值。该规则为A(x0)=(...((anx0+an−1)x0+...+a1)x0+a0) A(x_0) = ( ... (( a_n x_0 + a_{原创 2015-04-28 21:25:12 · 3465 阅读 · 0 评论 -
100的阶层真的算不出来吗?
今天看到一个蛮有意思的题,是问“100!”的尾数有多少个零。尾数有多少个零,实际上指的是从这个数的最后一个不为0的数的下一个(也就是0)开始计数,一直到最后一个数(这些数自然都是0)有多少个0。好吧,也就是说13330330000的尾数有4个零……一个整数若含有因子5,则必然在求解100!时产生一个0,也就是说我们从5开始for循环,每次循环都给加上5,然后计数器加1。同时如果该整数还能被25整除,原创 2015-05-05 19:43:31 · 6314 阅读 · 0 评论 -
字典序最小问题——Best Cow Line
#include <cstdio>#include <iostream>using namespace std;#define MAX_N 2000int N;char S[MAX_N+1];void solve(){ int a=0,b=N-1; while(a<=b) { bool left=false; for(int i=0;a+i<原创 2015-05-19 14:42:08 · 2695 阅读 · 0 评论 -
Saruman's Army
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;#define MAX_N 2000int N,R;int X[MAX_N];void solve(){ sort(X,X+N); int i=0,ans=0; while(i<N) { int原创 2015-05-19 15:17:11 · 2654 阅读 · 0 评论 -
区间调度问题
#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int MAX_N = 100000;int N,S[MAX_N],T[MAX_N];pair<int,int> itv[MAX_N];void solve(){ for(int i=0;i<N;i++) {原创 2015-05-19 14:28:22 · 2560 阅读 · 0 评论 -
【算法】5 传说中的快排是怎样的,附实现示例
什么是快速排序快速排序简介快速排序(英文名:Quicksort,有时候也叫做划分交换排序)是一个高效的排序算法,由Tony Hoare在1959年发明(1961年公布)。当情况良好时,它可以比主要竞争对手的归并排序和堆排序快上大约两三倍。这是一个分治算法,而且它就在原地排序。所谓原地排序,就是指在原来的数据区域内进行重排,就像插入排序一般。而归并排序就不一样,它需要额外的空间来进行...原创 2015-06-02 23:02:59 · 13096 阅读 · 22 评论