我自己的noip复习(实时更新)
来源:互联网 发布:spring源码视频百度云 编辑:程序博客网 时间:2024/04/30 19:15
引子:对拍
姑且将数据程序命名为data.exe,将暴力程序和待测程序命名为check.exe和prob.exe,以如下格式编辑bat文件:
:loop
data.exe
check.exe
prob.exe
fc check.out prob.out
if %errorlevel%==0 goto loop
pause
如果始终不停止说明待测程序在该随机数据程序下基本正确。
第一部分——排序
排序是信息学竞赛中最为基本的一种算法,应用极其灵活。个别排序算法在排序的同时可以实现其他的功能(如归并的逆序对等),一下列举几种常见的排序。
1、 冒泡排序。冒泡排序是最暴力也是最容易的排序,时间O(n2)。在数据小的时候可以通过冒泡进行排序(不提倡)。因为冒泡极其简单,所以在这里就不进行说明。
2、 快速排序。快速排序是信息学竞赛中最为常用的排序之一,因其方法的简单易懂和O(nlogn)的时间复杂度适用于大部分的题目。
3、 归并排序。归并排序和快速排序一样,都是O(nlgn)的时间复杂度。然而归并排序胜在它能处理逆序对的问题。
介绍排序之前,我们先梳理一下归并的思想。
现在有两个已经排好序的数组a、b,你的目的是要在O(n)的时间内把这两个数组
合并为一个有序的数组c。
4、 桶排序(记录排序)。在需要排序的数据本身大小比较小的时候,可以考虑使用桶排序算法。优点是可以用O(1)的时间复杂度知道某数据出现的次数。
5、 堆排序。堆排序分为小根堆排序(从大到小)和大根堆排序(从小到大)。在这里以大根堆为例进行叙述。
要进行堆排序,首先先要介绍堆的概念。其实堆就是一棵完全二叉树,但在完全二叉树的概念上增加了一条,即某非叶节点的点权值恒≥(或恒≤)它的左右孩子的点权值。也就是说,满足key[i]>=key[2i+1]&&key[i]>=key[2i+2]称为大顶堆,满足 key[i]<=key[2i+1]&&key[i]<=key[2i+2]称为小顶堆。堆就是小顶堆和大顶堆的总称。
对于堆而言,有一个很重要的操作——Down。归根到底,Down操作就是用来维护堆的性质的。就一棵普通的完全二叉树来说,要将其转化为堆,只需要对前半节点进行Down就可以了。(P.S. 在完全二叉树中,非叶节点有 Size/2 个)需要注意的是,先对前半节点中最后一个节点进行操作。具体代码见程序。
在建好堆之后,就可以进行排序了。我们先将根节点和最后一个节点进行互换,也就是将a[1]和a[Size]进行互换,再将变换后得到的a[1]进行Down操作,同时Size减一(即删除一个最大(小)值并将其放在最后)。这样执行Size次就可以得到一个从小(大)到大(小)的序列了。
(对于STL我表示沉默)
- 我自己的noip复习(实时更新)
- 我的成长之路(实时更新小目标)
- 发一个自己常用的通信词汇缩写表(实时更新)
- 记录自己经常使用的vim技巧(实时更新)
- 图论(2017NOIP复习)
- NOIP专题复习(一) 基础的背包问题
- 我所理解的Cocos2d-x 实时更新游戏对象
- 我的NOIP被坑史
- 我的NOIP
- 我的NOIP-Bzy
- 常用的函数收集(实时更新)
- 易犯的错误(实时更新)
- lucene的实时更新
- noip初赛复习(全)(转)
- 数学复习(2017NOIP集训)
- 常用命令 (实时更新)
- noip中学到的小知识(更新中)
- 给出百度首页,写出测试用例(我自己写的,欢迎大家参与更新)
- C++基础---数组
- C++基础---多维数组
- Keepalived简介
- C++基础---指针数组与数组指针
- 多线程
- 我自己的noip复习(实时更新)
- 【Python】virtualenv —— 建立Python虚拟环境
- 算法题:剔除字符串(很有意思)
- python爬虫 爬取淘女郎介绍以及照片
- APACHE2.X 禁止服务器IP直接访问
- 生活灵感汇总
- Azure WEBsite 的跨站点高可用(上海数据中心-北京数据中心)
- spoj K-th Number (classic! 区间静态第k大)
- HDU1950-Bridging signals-最长上升子序列