NOIP2010集训小资料

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NOIP2009集训小资料
——章琨目录
1.反约瑟夫问题
2.空间的计算
3.树的性质
4.最大公约数
5. Catalan数
6.最短路floyed
7.小技巧
8.最短路SPFA
9.move函数
10.最长上升(下降)子序列[nlogn]
11.字母树
12.几类背包问题
13.最长上升公共子序列
14.树的遍历
15.循环小数转分数
16.字典序法求排列
17.康托展开
18.随机顺序
19.最小区间覆盖问题
20.K短路
21. Fibonacci数列
22.关键路径
23.中缀转后缀
24.后缀转中缀
25.最小生成树Kruskal
算法精华
1.反约瑟夫环问题
f[i]代表i个人报数,报到j的出局时最后出圈的人的序号
f[1]=1
f[i]=(f[i-1]+j-1) mod i+1
2.空间的计算
每类型所占字节*1024*1024*个数(单位M)
3.如果一个图中任意两点有且只存在一条简单路径那么它就是一棵树
4.求最大公约数(欧几里德算法)=>链接
function gcd(x,y:longint):longint;
begin
if y=0
then gcd:=x
else gcd:=gcd(y,x mod y);
最小公倍数*最大公约数=两数之积
5. 卡特兰数=>链接
通项公式:f[n]=)!1( !)!2(+⨯n n n = 2
3....)1()2()3(....)1*2(2⨯⨯⨯-⨯+⨯+⨯⨯-⨯n n n n n n 递推公式:f[n]=f[1]*f[n-1]+f[2]*f[n-2]+…+f[n -1]*f[1] n>=2 f[1]=1
前十项
6. floyed 求最短路=>链接
For k:= 1 to n do
for i:= 1 to n do
for j:= 1 to n do
if f[i,k]+f[k,j]>f[i,j] then
f[i,j]:=f[i,k]+f[k,j];
中间值要放在外层循环
7. 小技巧
div 2 的时间长于 shr 1
i:=i+1 的时间长于 inc(i)
i:=i-1 的时间长于 dec(i)
longint 比 integer 快
8. SPFA 求单元最短路=>链接
注意事项:
[1]Next[i]代表在边集数组中下标为i 的边的同起点的边在边集数组中的下标
[2]Dian[i]代表起点为i 的边在边集数组中的下标
[3]无向边要分为两个有向边
9. move 函数的用法(速度是循环的10倍以上)[考试时最好不要使用]
Move[a[i],b[j],sizeof(类型)*k]代表从a 数组第i 位到第i+k-1位的部分赋值给b 数组第j 位到第j+k-1位
10. nlogn 的最长上升(下降)子序列=>链接
Shu[i]代表数列的第i 位
F[i]代表以第i 项结尾的最长上升子序列的长度
G[k]代表长度为k 的最长上升子序列的最小值(G[k]=min(shu[i]) i 满足f[i]=k) Len 为G 数组的尾指针
主要步骤:
[1]当shu[i]>g[len]那么尾指针后移1位,g[len]:=shu[i]
[2]当shu[i]<=g[len]那么在[0,len]这个区间二分查找shu[i]在[x,y]中则f[i]:=y 并更新g[y]:=i
11. 字母树的建立=>链接
Tree[i,ch]代表父亲节点为i 的点,本身字母为ch 的点的编号
ge 为除根节点外节点个数
可用于找公共前缀
12. 各类背包问题的分析=>链接
W 为费用 T 为价值
[1]0/1背包
For i:= 1 to n do
For j:=v downto 1 do
If f[j]<f[i-w[i]]+t[i] then
f[j]:=f[i-w[i]]+t[i]
[2]完全背包
For i:= 1 to n do
For j:= 1 to v do
If f[j]<f[i-w[i]]+t[i] then
f[j]:=f[i-w[i]]+t[i]
[3]多重背包:将n[i]个物品拆成n[i]个后再进行0/1背包
[4]分组背包
For i:= 1 to n do
For j:=v downto 1 do
For k:= 1 to z do
If f[j]<f[i-w[k][i]]+t[k][i] then
f[j]:=f[i-w[k][i]]+t[k][i]
13. 最长上升公共子序列=>链接
F[i]代表b 序列尾位为i 时的最长长度
F[i]=max(f[i`])+1 i`<i
14. 树的3种遍历的顺序:
先序遍历顺序:根节点—左子树—右子树
中序遍历顺序:左子树—根节点—右子树
后序遍历顺序:左子树—右子树—根节点
15. 循环小数转为分数=>链接
0.[ a ][ a ][ a ] [ a ]…… =9999......99999]
[a
X 位 X 位
0.[ b ][ a ][ a ][ a ] [ a ]……=00....100][000...99000...99][b a + Y 位 X 位 X 个9 Y 个0 Y 个0 注:[ a ]表示循环节
16. 字典序法求下一个排列=>链接
主要步骤:
[1]从右往左找到第一个比右边的数小的数的编号j
[2]在[j+1,n]中找到比a[j]大最小的数编号为k
[3]交换j 和k 位置上的数
[4]将区间[j+1,n]中的数倒转
17. 全排列的项数与排列的转换
求排列在全排列中的项数(康托展开):
F[i]表示排列中的第i 位(从右往左)的右边有多少个数比比它小
项数=)!1(][1-⨯∑=i i F n
i
求全排列的第i 项得排列
把i 变为阶乘进制数 if f[i]>=I then begin f[i+1]:=f[i+1]+f[i] div I; f[i]:=f[i] mod I; end; 即!0]1[!1]2[......)!2(]1[)!1(][⨯+⨯++-⨯-+-⨯=f f n n f n n f I 第j 位为剩下的数中第f[j]+1小的数,然后依次还原排列
18. 随机一个顺序
时间复杂度O(n)
枚举每一个点与随机到的位置交换
19. 最小区间覆盖问题=>2008年周小博论文
描述:有n 个区间,选择尽量少的区间,使得这些区间完全覆盖某线段[s,t] 算法:
[1]按左端点坐标排序
[2]每次选择覆盖点s 的区间中右端点坐标最大的一个,并更新s
[3]直到所选区间已包含t
20. 无向图中第K 短路的求法=>链接
二分K 短路的长度
每次求出长度小于等于二分长度的路径条数
条数大于等于K 时右边界左移
条数小于K 时左边界右移
直到左右边界相差1,k 为1时输出x ;否则输出y
21. Fibonacci 数列
递推公式:f[i]=f[i-1]+f[i-2]
通项公式:⎥⎦
⎤⎢⎣⎡--+=n n n F )^251()^251(55][
22. 关键路径
算法步骤:
[1]添加一个起点和终点,求出AOE 网中的拓扑序列,若有环工程无法开始。

[2]起点的最早发生时间为0,按拓扑序列的顺序求出其他节点的最早发生时间(父节点的最早发生时间为子节点中最早发生时间加上到父节点的权值最大的一个)。

[3]终点的最早发生时间等于最晚发生时间,按拓扑逆序列求出其他节点的最晚发生时间(子节点的最晚发生时间为父节点的最晚发生时间减去子节点到父亲的时间)。

[4]如果节点的最早发生时间等于最晚发生时间则该工程为关键工程。

[5]依次连接关键工程即为关键路径。

23. 中缀转后缀
算法步骤:
[1]判断式子是否被括号所包裹,有则去除。

[2]在式子中找到一个不在括号中的最靠后的加减号。

[3]在式子中找到一个不在括号中的最靠后的乘除号。

[4]如果存在加减号则取加减否则取乘除
[5]左右进行递归处理。

24. 后缀转中缀
算法步骤:
[1]依次将式子中的字符入栈,如果发现符号则将栈顶的元素变为字符的右儿子,次栈顶元素变为左儿子,栈顶指针减2。

[2]输出时先输出左子树,然后输出本身,再输出右子树,注意添加括号。

[3]子树递归处理。

25. 最小生成树Kruskal
算法步骤:
[1]将边按长度从小到大排序
[2]每次取出最小的边,若不会构成环则加入树中,用并查集将两端点合并。

相关文档
最新文档