Noip常用算法大全_第1頁
Noip常用算法大全_第2頁
已閱讀5頁,還剩6頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 11/11Noip常用算法大全 Noip常用算法大全 一、數論算法 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; begin if a0 do inc(lcm,a); end; 3素數的求法 A.小范圍內判斷一個數是否為質數: function prime (n: integer): Boolean; var I: integer; begi

2、n for I:=2 to trunc(sqrt(n) do if n mod I=0 then begin prime:=false; exit; end; prime:=true; end; B.判斷l(xiāng)ongint范圍內的數是否為素數(包含求50000以內的素數表): procedure getprime; var i,j:longint; p:array1.50000 of boolean; begin fillchar(p,sizeof(p),true); p1:=false; i:=2; while i=x then break else if x mod pri=0 then ex

3、it; prime:=true; end;prime 二、圖論算法 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 begin lowcost:=costv0,i; closest:=v0; end; for i:=1 to n-1 do begin 尋找離生成樹最近的未加入頂點k min:=maxlongint; for j:=1 to n do if (lowcostj0) th

4、en begin min:=lowcostj; k:=j; end; lowcostk:=0; 將頂點k加入生成樹 生成樹中增加一條新的邊k到closestk 修正各點的lowcost和closest值 for j:=1 to n do if costk,j0 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.標號法求解單源點最短路徑: v

5、ar a:array1.maxn,1.maxn of integer; b:array1.maxn of integer; b指頂點i到源點的最短路徑 mark:array1.maxn 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 mark

6、j) and (ai,j0) then if (best=0) or (b+ai,j0 then begin bbest_j:=best;markbest_j:=true; end; until best=0; end;bhf B.Floyed算法求解所有頂點對之間的最短路徑: procedure floyed; begin for I:=1 to n do for j:=1 to n do if 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

7、 j:=1 to n do if ai,k+aj,k 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); begin fillchar(mark,sizeof(mark),false); for i:=1 to n do begin d:=av0,i;

8、if d0 then begin marku:=true; for i:=1 to n do if (not mark) and (au,i+du表示,則Ee = Vej; d. 邊活動最晚開始時間El, 若邊I由表示,則El = Vlk wj,k; 若Eej = Elj ,則活動j為關鍵活動,由關鍵活動組成的路徑為關鍵路徑。 求解方法: a. 從源點起topsort,判斷是否有回路并計算Ve; b. 從匯點起topsort,求Vl; c. 算Ee 和El; 6拓撲排序 找入度為0的點,刪去與其相連的所有邊,不斷重復這一過程。 例尋找一數列,其中任意連續(xù)p項之和為正,任意q 項之和為負,若不存

9、在則輸出NO. 7.回路問題 Euler回路(DFS) 定義:經過圖的每條邊僅一次的回路。(充要條件:圖連同且無奇點) Hamilton回路 定義:經過圖的每個頂點僅一次的回路。 一筆畫 充要條件:圖連通且奇點個數為0個或2個。 9判斷圖中是否有負權回路Bellman-ford 算法 x,y,t分別表示第I條邊的起點,終點和權。共n個結點和m條邊。 procedure bellman-ford begin for I:=0 to n-1 do d:=+infinitive; d0:=0; for j:=1 to m do 枚舉每一條邊 if dxj+tj=best then exit; sn為

10、前n個物品的重量和 if kwk then search(k+1,v-wk); search(k+1,v); end; end; l DP FI,j為前i個物品中選擇若干個放入使其體積正好為j的標志,為布爾型。 實現(xiàn):將最優(yōu)化問題轉化為判定性問題 f I, j = f i-1, j-w (w0 then if j+now=0 Then Begin t:=problemj.point+fi-problemj.time; If tf Then f:=t; End; Writeln(fM); End. C.求恰好裝滿的情況數。 Ahoi2001 Problem2 求自然數n本質不同的質數和的表達式的

11、數目。 思路一,生成每個質數的系數的排列,在一一測試,這是通法。procedure try(dep:integer); var i,j:integer; begin cal; 此過程計算當前系數的計算結果,now為結果 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 t

12、ry(dep,rest:integer); var i,j,x:integer; begin if (rest0 then for k:=1 to n div now do if j+now*kmid do dec(j);在右半部分尋找比中間數小的數 if ij; if laj then swap(a,aj); end; D. 冒泡排序 procedure bubble_sort; var i,j,k:integer; begin for i:=1 to n-1 do for j:=n downto i+1 do if aj E.堆排序: procedure sift(i,m:integer)

13、;調整以i為根的子樹成為堆,m為結點總數 var k:integer; begin a0:=a; k:=2*i;在完全二叉樹中結點i的左孩子為2*i,右孩子為2*i+1 while kb0 then len:=a0 else len:=b0; for i:=1 to len do begin inc(c,a+b); if c10 then begin dec(c,10); inc(ci+1); end; 進位 end; if clen+10 then inc(len); c0:=len; end;plus 2高精度減法 procedure substract(a,b:hp;var c:hp);

14、 var i,len:integer; begin fillchar(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; begin fillchar(c,sizeof(c),0); len:=a0; for i:=1 to len

15、do begin inc(c,a*b); inc(ci+1,(a*b) div 10); c:=c mod 10; end; inc(len); while (clen=10) do begin 處理最高位的進位 clen+1:=clen div 10; clen:=clen mod 10; inc(len); end; while (len1) and (clen=0) do dec(len); 若不需進位則調整len c0:=len; end;multiply 4高精度乘以高精度 procedure high_multiply(a,b:hp; var c:hp var i,j,len:in

16、teger; begin fillchar(c,sizeof(c),0); for i:=1 to a0 do for j:=1 to b0 do begin inc(ci+j-1,a*bj); inc(ci+j,ci+j-1 div 10); ci+j-1:=ci+j-1 mod 10; end; len:=a0+b0+1; while (len1) and (clen=0) do dec(len); c0:=len; end; 5高精度除以低精度 procedure devide(a:hp;b:longint; var c:hp; var d:longint); c:=a div b; d

17、:= a mod b var i,len:integer; begin fillchar(c,sizeof(c),0); len:=a0; d:=0; for i:=len downto 1 do begin d:=d*10+a; c:=d div b; d:=d mod b; end; while (len1) and (clen=0) then dec(len); c0:=len; end; 6高精度除以高精度 procedure high_devide(a,b:hp; var c,d:hp); var i,len:integer; begin fillchar(c,sizeof(c),0

18、); fillchar(d,sizeof(d),0); len:=a0;d0:=1; for i:=len downto 1 do begin multiply(d,10,d); d1:=a; while(compare(d,b)=0) do 即d=b begin Subtract(d,b,d); inc(c); end; end; while(len1)and(c.slen=0) do dec(len); c.len:=len; end; 六、樹的遍歷 1已知前序中序求后序 procedure Solve(pre,mid:string); var i:integer; begin if (p

19、re=) or (mid=) then exit; i:=pos(pre1,mid); solve(copy(pre,2,i),copy(mid,1,i-1); solve(copy(pre,i+1,length(pre)-i),copy(mid,i+1,length(mid)-i); post:=post+pre1; 加上根,遞歸結束后post即為后序遍歷 end; 2已知中序后序求前序 procedure Solve(mid,post:string); var i:integer; begin if (mid=) or (post=) then exit; i:=pos(postlengt

20、h(post),mid); pre:=pre+postlength(post); 加上根,遞歸結束后pre即為前序遍歷 solve(copy(mid,1,I-1),copy(post,1,I-1); solve(copy(mid,I+1,length(mid)-I),copy(post,I,length(post)-i); end; 3已知前序后序求中序的一種 function ok(s1,s2:string):boolean; var i,l:integer; p:boolean; begin ok:=true; l:=length(s1); for i:=1 to l do begin p

21、:=false; for j:=1 to l do if s1=s2j then p:=true; if not p then begin ok:=false;exit;end; end; end; procedure solve(pre,post:string); var i:integer; begin if (pre=) or (post=) then exit; i:=0; repeat inc(i); until ok(copy(pre,2,i),copy(post,1,i); solve(copy(pre,2,i),copy(post,1,i); midstr:=midstr+pr

22、e1; solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1); end; 七進制轉換 1任意正整數進制間的互化 除n取余 2實數任意正整數進制間的互化 乘n取整 3負數進制: 設計一個程序,讀入一個十進制數的基數和一個負進制數的基數,并將此十進制數轉換為此負進制下的數:-R-2,-3,-4, (20) 八全排列與組合的生成 1排列的生成:(1.n) procedure solve(dep:integer); var begin if dep=n+1 then begin writeln(s);exit; end;

23、 for i:=1 to n do if not used then begin s:=s+chr(i+ord(0);used:=true; solve(dep+1); s:=copy(s,1,length(s)-1); used:=false; end; end; 2組合的生成(1.n中選取k個數的所有方案) procedure solve(dep,pre:integer); var i:integer; begin if dep=k+1 then begin writeln(s);exit; end; for i:=1 to n do if (not used) and (ipre) th

24、en begin s:=s+chr(i+ord(0);used:=true; solve(dep+1,i); s:=copy(s,1,length(s)-1); used:=false; end; end; 九.查找算法 1折半查找 function binsearch(k:keytype):integer; var low,hig,mid:integer; begin low:=1;hig:=n; mid:=(low+hig) div 2; while (amid.keyk then hig:=mid-1 else low:=mid+1; mid:=(low+hig) div 2; end;

25、 if lowhig then mid:=0; binsearch:=mid; end; 2樹形查找 二叉排序樹:每個結點的值都大于其左子樹任一結點的值而小于其右子樹任一結點的值。查找 function treesrh(k:keytype):pointer; begin q:=root; while (qnil) and (q.keyk) do if k=adep-1 then inc(sum); exit; end; for i:=adep-1 to tot div 2 do begin adep:=i; dec(tot,i); try(dep+1); inc(tot,i); end; end;try 十三、BFS框架 IOI94 房間問題 head:=1; tail:=0; while tail=1) and (In do begin for i:=1 to n

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論