算法竞赛入门教程 1

笔者几个月前才转了专业,算法水平还不是很强,所以每周尽量学一点算法的内容。

话不多说,我们开始吧。

在算法入门学习中,这一些问题是最常见的:

Dynamic Programming(动态规划) Greedy(贪心)   Complete Search(穷举) Flood Fill (种子填充) Shortest Path (最短路径) Recursive Search Techniques (回溯) Minimum Spanning Tree (最小生成树) Knapsack(背包)   Computational Geometry(计算几何) Network Flow(网络流) Eulerian Path (欧拉回路) Two-Dimensional Convex Hull (二维凸包) BigNums (大数) Heuristic Search(启发式搜索) Approximate Search (近似搜索) Ad Hoc Problems(杂题)。

从一个helloworld开始:

OJ的多组输入:

题目一: 输入2个数a b,输出a+b的和. 输入包括多组数据,处理至文件结束,如下:

5   8        13

6   9        15

9   3        12

1   2         3

用C来写的话

#include
int main()
{
    int a, b;
    while(scanf("%d %d", &a, &b) != EOF)
    {
           printf("%d\n", a + b);
    }
    return 0;
}

用C++写的话

#include
using namespace std;
int main()
{
    int a, b;
    while(cin>>a>>b)
    {
           cout<

我们尽量不混合c,c++的输入输出方式,数据规模较大,推荐用scanf。

//前话说到这里为止。

 

我们再谈谈猜数游戏,题目如下:

 比如小明说他心中想到一个0-1000之间的数字,这个数字他要告诉给老师,然后让其他人来提问。 提问的人可以问任何问题,但小明只能用YES/NO作答。 请问多少次可以猜到?

首先容易想到的是暴力枚举,其次再是别的策略:比如你回答得是,其他人猜测的数字是低了还是高了?

然后就可以逐渐二分估计策略来简化猜测过程了,这个方法就是决策树吧?(不对请指出)

 

然后我们再看一个递归策略:

学过c的都知道汉诺塔问题,说白了这也是用递归实现的,只是不是那么直观。这是笔者两个月前补BIT的课之后弄出来的,文件头就不写了,思想还是比较简约,我叙述一下:核心解决方法就是借助过渡杆buffer,完成n-1个盘子借助最后面的杆转移到中间的杆子,然后再把最后那个最大的盘子直接移到最后的杆子,再把第二个杆子里面借助第一个杆子移到第三个杆子。

    void move(char getone, char putone)
	{
	printf("%c--->%c\n", getone, putone);     //将一个盘从getone取走,放到putone
	}
	

    void hanoi(int n, char one, char two, char three) 
     //将n个盘从one杆,借助two杆,到达three杆子
	{
	if (n == 1) move(one, three);
	else
	{
	hanoi(n - 1, one, three, two);
	move(one, three);
	hanoi(n - 1, two, one, three);
	}
	}


	int main(void)
	{
	//汉诺塔问题
	int m;
	printf("Input the number of disks:");
	scanf("%d", &m);
	printf("The steps to moving the %d disks are as follows:\n", m);
	hanoi(m, 'A', 'B', 'C');
	system("pause");
	return 0;
	}

然后还有一个算法就是并行式计算,这里我们先不讲,因为我比较菜。

 

接下来的水文我来学一学递归方程的解法,单独开,本篇作为引入,到此为止。

你可能感兴趣的:(算法)