NOIP复赛冲刺资料集锦10.pdf
《NOIP复赛冲刺资料集锦10.pdf》由会员分享,可在线阅读,更多相关《NOIP复赛冲刺资料集锦10.pdf(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、数论算法顶级?下一页 1求两数的最大公约数function gcd(a,b:integer):integer;begin if b=0 then gcd:=a?else gcd:=gcd(b,a mod b);end;2求两数的最小公倍数function lcm(a,b:integer):integer;beginif a0 do inc(lcm,a);end;3素数的求法A.小范围内判断一个数是否为质数:function prime(n:integer):Boolean;var I:integer;begin?for I:=2 to trunc(sqrt(n)do?if n mod I=0
2、then begin?prime:=false;exit;?end;?prime:=true;end;B.判断longint范围内的数是否为素数(包含求50000以内的素数表):procedure getprime;?var?i,j:longint;?p:array1.50000 of boolean;?begin?fillchar(p,sizeof(p),true);p1:=false;i:=2;while i50000 do beginif p then begin?j:=i*2;?while j=x then break?else if x mod pr=0 then exit;prim
3、e:=true;end;prime Page 1ABC Amber CHM Converter Trial version,http:/ 1最小生成树A.Prim算法:procedure prim(v0:integer);?var?lowcost,closest:array1.maxn of integer;i,j,k,min:integer;?begin?for i:=1 to n do beginlowcost:=costv0,i;closest:=v0;end;for i:=1 to n-1 do begin寻找离生成树最近的未加入顶点kmin:=maxlongint;for j:=1
4、to n do?if(lowcostjmin)and(lowcostj0)then begin?min:=lowcostj;?k:=j;?end;lowcostk:=0;将顶点k加入生成树?生成树中增加一条新的边k到closestk修正各点的lowcost和closest值for j:=1 to n do?if costk,jlwocostj then begin?lowcostj:=costk,j;?closestj:=k;?end;end;end;primB.Kruskal算法:(贪心)按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。function find(v:inte
5、ger):integer;返回顶点v所在的集合var i:integer;begini:=1;while(i=n)and(not v in vset)do inc(i);if i0 do begin?i:=find(eq.v1);j:=find(eq.v2);?if ij then begin?inc(tot,eq.len);?vset:=vset+vsetj;vsetj:=;?dec(p);?end;?inc(q);end;writeln(tot);end;2.最短路径A.标号法求解单源点最短路径:var?a:array1.maxn,1.maxn of integer;?b:array1.m
6、axn of integer;b指顶点i到源点的最短路径Page 2ABC Amber CHM Converter Trial version,http:/ of boolean;procedure bhf;?var?best,best_j:integer;?begin?fillchar(mark,sizeof(mark),false);mark1:=true;b1:=0;1为源点repeat?best:=0;?for i:=1 to n do?If mark then 对每一个已计算出最短路径的点?for j:=1 to n do?if(not markj)and(ai,j0)then?if
7、(best=0)or(b+ai,j0 then begin?bbest_j:=best;markbest_j:=true;?end;?until best=0;?end;bhfB.Floyed算法求解所有顶点对之间的最短路径:?procedure floyed;?beginfor I:=1 to n dofor j:=1 to n doif aI,j0 then pI,j:=I else pI,j:=0;pI,j表示I到j的最短路径上j的前驱结点for k:=1 to n do 枚举中间结点for i:=1 to n do?for j:=1 to n do?if ai,k+aj,kai,j t
8、hen begin?ai,j:=ai,k+ak,j;?pI,j:=pk,j;?end;?end;C.Dijkstra 算法:var?a:array1.maxn,1.maxn of integer;?b,pre:array1.maxn of integer;pre指最短路径上I的前驱结点?mark:array1.maxn of boolean;procedure dijkstra(v0:integer);beginfillchar(mark,sizeof(mark),false);for i:=1 to n do begin?d:=av0,i;?if d0 then pre:=v0 else p
9、re:=0;end;markv0:=true;repeat?每循环一次加入一个离1集合最近的结点并调整其他结点的参数?min:=maxint;u:=0;u记录离1集合最近的结点?for i:=1 to n do?if(not mark)and(dmin)then begin?u:=i;min:=d;?end;?if u0 then begin?mark:=true;?for i:=1 to n do?if(not mark)and(au,i+dd)then begin?d:=au,i+d;?pre:=u;?end;?end;until u=0;end;3.计算图的传递闭包Procedure L
10、onglink;VarPage 3ABC Amber CHM Converter Trial version,http:/ of boolean;BeginFillchar(t,sizeof(t),false);For k:=1 to n doFor I:=1 to n doFor j:=1 to n do TI,j:=tI,j or(tI,k and tk,j);End;4无向图的连通分量A.深度优先procedure dfs(now,color:integer);begin?for i:=1 to n do?if anow,i and c=0 then begin 对结点I染色?c:=co
11、lor;?dfs(I,color);?end;end;B 宽度优先(种子染色法)5关键路径几个定义:顶点1为源点,n为汇点。a.顶点事件最早发生时间Vej,Ve j=max Ve j+wI,j,其中Ve(1)=0;b.顶点事件最晚发生时间 Vlj,Vl j=min Vlj wI,j,其中 Vl(n)=Ve(n);c.边活动最早开始时间 EeI,若边I由表示,则EeI=Vej;d.边活动最晚开始时间 ElI,若边I由表示,则ElI=Vlk wj,k;若 Eej=Elj,则活动j为关键活动,由关键活动组成的路径为关键路径。求解方法:a.从源点起topsort,判断是否有回路并计算Ve;b.从汇点起
12、topsort,求Vl;c.算Ee 和 El;6拓扑排序找入度为0的点,删去与其相连的所有边,不断重复这一过程。例 寻找一数列,其中任意连续p项之和为正,任意q 项之和为负,若不存在则输出NO.7.回路问题Euler回路(DFS)定义:经过图的每条边仅一次的回路。(充要条件:图连同且无奇点)Hamilton回路定义:经过图的每个顶点仅一次的回路。一笔画充要条件:图连通且奇点个数为0个或2个。8判断图中是否有负权回路 Bellman-ford 算法xI,yI,tI分别表示第I条边的起点,终点和权。共n个结点和m条边。procedure bellman-fordbeginfor I:=0 to n
13、-1 do dI:=+infinitive;d0:=0;for I:=1 to n-1 dofor j:=1 to m do 枚举每一条边if dxj+tjdyj then dyj:=dxj+tj;for I:=1 to m doif dxj+tjdyj then return false else return true;end;9第n最短路径问题*第二最短路径:每举最短路径上的每条边,每次删除一条,然后求新图的最短路径,取这些路径中最短的一条即为第二最短路径。*同理,第n最短路径可在求解第n-1最短路径的基础上求解。Page 4ABC Amber CHM Converter Trial v
14、ersion,http:/ 装箱问题 有一个箱子容量为v(正整数,ov20000),同时有n个物品(on30),每个物品有一个体积(正整数)。要求从 n个物品中,任取若千个装入箱内,使箱子的剩余空间为最小。l 搜索方法procedure search(k,v:integer);搜索第k个物品,剩余空间为vvar i,j:integer;begin?if v=best then exit;sn为前n个物品的重量和?if kwk then search(k+1,v-wk);?search(k+1,v);?end;end;l DPFI,j为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。
15、实现:将最优化问题转化为判定性问题f I,j=f i-1,j-w (wI=j0 then?if j+now=n then inc(cj+now,aj);a:=c;end;2可重复背包A求最多可放入的重量。FI,j为前i个物品中选择若干个放入使其体积正好为j的标志,为布尔型。状态转移方程为fI,j=f I-1,j wI*k (k=1.j div wI)B.求可以放入的最大价值。USACO 1.2 Score Inflation进行一次竞赛,总时间T固定,有若干种可选择的题目,每种题目可选入的数量不限,每种题目有一个ti(解答此题所需的时间)和一个si(解答此题所得的分数),现要选择若干题目,使解
16、这些题的总时间在T以内的前提下,所得的总分最大,求最大的得分。*易想到:?fi,j=max f i-k*wj,j-1+k*pj (0=k=0 ThenBegin?t:=problemj.point+fi-problemj.time;?If tf Then f:=t;End;Writeln(fM);End.C.求恰好装满的情况数。Ahoi2001 Problem2求自然数n本质不同的质数和的表达式的数目。思路一,生成每个质数的系数的排列,在一一测试,这是通法。procedure try(dep:integer);var i,j:integer;begin?cal;此过程计算当前系数的计算结果,n
17、ow为结果?if nown then exit;剪枝?if dep=l+1 then begin 生成所有系数?cal;?if now=n then inc(tot);?exit;?end;?for i:=0 to n div prdep do begin?xsdep:=i;?try(dep+1);?xsdep:=0;?end;end;思路二,递归搜索效率较高procedure try(dep,rest:integer);var i,j,x:integer;begin?if(rest0 then?for k:=1 to n div now do?if j+now*k=n then inc(cj
18、+now*k,aj);a:=c;end;mainbegin read(now);读入第一个物品的重量i:=0;?a为背包容量为i时的放法总数while i=n do begin a:=1;inc(i,now);end;定义第一个物品重的整数倍的重量a值为1,作为初值for i:=2 to v dobeginread(now);update;动态更新end;writeln(an);Page 6ABC Amber CHM Converter Trial version,http:/ 7ABC Amber CHM Converter Trial version,http:/ 1.快速排序:proce
19、dure qsort(l,r:integer);var i,j,mid:integer;begin?i:=l;j:=r;mid:=a(l+r)div 2;将当前序列在中间位置的数定义为中间数repeat?while amid do dec(j);在右半部分寻找比中间数小的数?if ij;if lj then qsort(l,j);若未到两个数的边界,则递归搜索左右区间if ir then qsort(i,r);end;sort 2.插入排序:思路:当前a1.ai-1已排好序了,现要插入a使a1.a有序。procedure insert_sort;var i,j:integer;beginfor
20、 i:=2 to n do begin?a0:=a;?j:=i-1;?while a0aj then swap(a,aj);end;4.冒泡排序procedure bubble_sort;var i,j,k:integer;beginfor i:=1 to n-1 do?for j:=n downto i+1 do?if ajaj-1 then swap(aj,aj-1);每次比较相邻元素的关系end;5.堆排序:procedure sift(i,m:integer);调整以i为根的子树成为堆,m为结点总数var k:integer;begina0:=a;k:=2*i;在完全二叉树中结点i的左
21、孩子为2*i,右孩子为2*i+1while k=m do begin?if(km)and(akak+1)then inc(k);找出ak与ak+1中较大值if a0ak then begin a:=ak;i:=k;k:=2*i;endelse k:=m+1;end;a:=a0;将根放在合适的位置end;procedure heapsort;Page 8ABC Amber CHM Converter Trial version,http:/ j:=n div 2 downto 1 do sift(j,n);for j:=n downto 2 do begin?swap(a1,aj);?sift(
22、1,j-1);end;end;6.归并排序a为序列表,tmp为辅助数组procedure merge(var a:listtype;p,q,r:integer);将已排序好的子序列ap.q与aq+1.r合并为有序的tmpp.rvar I,j,t:integer;tmp:listtype;begint:=p;i:=p;j:=q+1;t为tmp指针,I,j分别为左右子序列的指针while(t=r)do begin?if(ir)or(a=aj)满足取左边序列当前元素的要求?then begin?tmpt:=a;inc(i);?end?else begin?tmpt:=aj;inc(j);?end;i
23、nc(t);end;for i:=p to r do a:=tmp;end;mergeprocedure merge_sort(var a:listtype;p,r:integer);合并排序ap.rvar q:integer;beginif pr then begin?q:=(p+r-1)div 2;?merge_sort(a,p,q);?merge_sort(a,q+1,r);?merge(a,p,q,r);end;end;mainbeginmerge_sort(a,1,n);end.7.基数排序思想:对每个元素按从低位到高位对每一位进行一次排序 Page 9ABC Amber CHM C
24、onverter Trial version,http:/ 高精度数的定义:typehp=array1.maxlen of integer;1高精度加法procedure plus(a,b:hp;var c:hp);var i,len:integer;beginfillchar(c,sizeof(c),0);if a0b0 then len:=a0 else len:=b0;for i:=1 to len do begininc(c,a+b);if c10 then begin dec(c,10);inc(ci+1);end;进位end;if clen+10 then inc(len);c0:
25、=len;end;plus 2高精度减法procedure substract(a,b:hp;var c:hp);var i,len:integer;beginfillchar(c,sizeof(c),0);if a0b0 then len:=a0 else len:=b0;for i:=1 to len do begin?inc(c,a-b);?if c1)and(clen=0)do dec(len);c0:=len;end;3高精度乘以低精度procedure multiply(a:hp;b:longint;var c:hp);var i,len:integer;beginfillchar
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- NOIP 复赛 冲刺 资料 集锦 10
限制150内