基础算法

1.枚举

枚举法也称穷举法,即从问题所有可能的解中一一枚举各元素,再用题目中的条件判断。
  优点:算法简单,在局部地方运用枚举法效果很好。
  缺点:运算量过大,当问题的规模很大时,循环的阶数越大,执行速度越慢。
  例子:百钱买百鸡
  up主给出的结论是尽量不要用枚举,要用的话一定要优化
  枚举法也有一些很恶心的题目:
  洛谷P5730
  洛谷P5731
  洛谷P1320
  洛谷P1205
  洛谷P3741
  都是一些水题,但也不是很好做呢,有空看看哟!
  洛谷P5015一道关于输入字符串的题目,挺好的

2.递推

通过已知条件,利用特定关系得出中间结论,直至得到结果。
递推算法分为顺推逆推

  • 顺推:斐波那契数列
  • 逆推:已知年利率,在n年后要有m元,要存多少钱?

3.贪心

所谓贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择,也就是说不从整体最优上加以考虑,他所做出的仅仅是在某种意义上的局部最优解。
  算法没有固定的算法框架,算法设计的关键是贪心策略的选择。必须要注意的是,贪心算法不是对所有问题都能得到整体最优解。选择的贪心策略必须具备无后效性,即某个状态以后的过程不会影响以前的状态,只与当前状态有关。
  所以对采用的贪心策略一定要仔细分析其是否满足无后效性,否则无法找到最优解,即无法使用贪心。
例题:
合并果子
P5019铺设道路
P1106删数问题
P1094纪念品分组(这题不用背包,与之类似,若是n个,也可以用此题相类似的方法:从大到小遍历,能加就加)

4.递归

递归算法是一种直接或间接调用自身函数或方法的算法。   
在做递归算法时一定要把握住出口,也就是做递归算法一定要有一个明确的结束条件。
递归对资源消耗很大。
放苹果

5.分治

分治就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题(递归)…,直到最后子问题可以简单的直接求解,解这些子问题,然后将各子问题的解合并得到原问题的解。
  分治法在每一层递归上都有三个步骤:

  • 分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。
  • 解决:若子问题规模较小而容易解决则直接解,否则递归的解各个子问题。
  • 合并:将各个子问题的解合并为原问题的解。

例题:求n个数的最大最小值
题解:分治

6.构造

根据题意生成符合要求的解。

7.模拟

模拟法是最直观的算法,通常是对一类事件进行描述,通过事件发生的先后顺序进行输入输出。模拟法只要读懂问题的要求,将问题中的各种事件进行编码即可完成。
  模拟法(Simulation)主要是在考验程序设计人员编写程序的功力,而非考验程序设计者的智力和创意。模拟法可以说是程序设计的基本功–问题说的很清楚,不用涉及复杂的演算法,只要按照规定做就好。
  模拟法的问题有时相当难缠,若是问题规定的错综复杂,那么写起程序就会相当累人,若一不小心犯了错误,那么只能望着长篇大论,杂乱无章的代码,从中找出错误所在,会非常痛苦。

8.排序

排序算法是一种将一串资料按照特定方式进行排序的一种算法。
排序
冒泡排序
快速排序  快速排序(自己写的)
简单插入排序
希尔排序
简单选择排序
堆排序
二路归并排序   归并排序(自己写的)
多路归并排序
计数排序
桶排序
基数排序
排序

9.检索

检索算法是在一串资料中查找符合条件的资料的算法。有顺序查找、二分查找、插值查找、动态查找等。
  主要介绍二分查找。
  二分查找也称折半查找,是一种效率较高的查找方法。但是二分查找要求线性表必须用顺序存储方式,而且表中元素按关键字有序排列。
  二分查找代码:

int binary_search(int a[],int n,int key)
{
	int m;
	int l=0;
	int r=n-1;
	while(l<r)
	{
		m=l+((r-l)>>1);//元素相同时下标最小
		//m=l+((r+l-1)>>1)元素相同时下标最大
		if(a[m]<key)
			l=m+1;
		else
			r=m;
	}
	if(a[r]==key)
		return r;
	return -1;
}

10.高精度

高精度一般都是处理一部分数据,一般与别的题目相结合。高精度常见的是加法和乘法,高精的板子因为封装内容很多,一般代码较长,推荐自己写比较(还不是因为找不到理想的板子?doge)
A+B P1601
A*B P1303
写在后面
up主建议:
1.建议先把握各类算法的整体框架,再在做题时视情况学习需要的知识。
2.善用各种搜索,善用各类博客,CSDN和博客园上有很多讲解各种算法的博客,值得关注。
3.坚持不懈,持之以恒。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值