我自己的noip复习(实时更新)

来源:互联网 发布:spring源码视频百度云 编辑:程序博客网 时间:2024/04/30 19:15

引子:对拍

姑且将数据程序命名为data.exe,将暴力程序和待测程序命名为check.exeprob.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)的时间复杂度。然而归并排序胜在它能处理逆序对的问题。

介绍排序之前,我们先梳理一下归并的思想。

现在有两个已经排好序的数组ab,你的目的是要在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我表示沉默)

0 0
原创粉丝点击