![OI基本算法總結_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf1.gif)
![OI基本算法總結_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf2.gif)
![OI基本算法總結_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf3.gif)
![OI基本算法總結_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf4.gif)
![OI基本算法總結_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf5.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、語言部分一、常用函數與過程: * abs(x):y 取x的絕對值,x與y可為整型或實型。 * frac(x):y 取x的小數部分,x與y均為實型。 * int(x):y 取x的整數部分,x與y均為實型,常寫成trunc(int(x). * random(x):y 在0-x之間的整數中隨機找一個整數,x與y均為整型。 * sin(x):y; cos(x):y; arctan(x):y; exp(x):y; ln(x):y 均與數學運算一致,三角函數返回的均為弧度,轉換成角度即乘以Pi除以180. * copy(str,n1,n2):substr 從字符串str中取從第n1個字符開始長度為n2個字
2、符的子串substr.n1和n2是整型表達式,如果n1大于s的長度,則返回空字符串。如果指定的n2大于第n1個字符后剩下的字符數,則返回剩下的字符串。 * pos(substr,str):num 查找substr是否為str的子串,若是則返回substr在str中的起始位置,若否則返回0. * val(str,int,code) 將字串str轉為數值型數據存入int, 如果字符串無效,其中非法字符的下標放在Code中;否則,code為零。 * str(num,str) 將num表達式轉成字符串str。 * delete( str,n1,n2) 從原字符串str中刪去一個從n1開始長度為n2的子
3、串,如果Index比s長,不刪除任何字符。如果指定的Count大于從第1ndex大到結尾的字符數,刪除剩余部分。 * Insert(Source:String;Var S:String;Index:Integer) Source是字符串表達式。S是任意長度的字符串變量。Index是整型表達式。過程Insert把字符串Source插入字符串S中第1ndex個字符開始的位置上。如果字符串比255個字符長,則將第255后面的字符截去。* FileSize(var f:text):longint 返回文件字節(jié)數。 * Flush(f:text) 如果正文文件由Rewr比和Append打開用來輸出,則對
4、F1ush的調用將騰空文件緩沖區(qū),這保證寫向文件的字符實際寫到外部文件上。Flush對打開用來輸入的文件沒有作用。 二、小技巧 1.ord('0')=48; ord('A'):=65; ord('a')=97; chr(32)= ; chr(33)=!; 2.求xy: int(exp(y*ln(x) 3.求x的n次方根:exp(1/n*ln(x) 4.標識符不能以數字開頭,其中不能有空格,點等符號。 5.說明部分順序: Lable -> Const -> type -> Var -> Procedure (Function
5、) 6.通常編譯器只能識別標識符的前8個字符。 7.規(guī)定false=0,true=1; 8.除實型外其他均為左留空,右看齊,實型向小數點看齊。 9實型默認場寬:17位 符號位+11位數字與一位小數點+E+00 數學部分一、常見遞推關系 1.Fibonacci 數列 A(1)=1; A(2)=1; A(n)=A(n-1) + A(n-2); 2.Catalan數: 考慮具有n個結點不同形態(tài)的二叉樹的個數H(n) H (0) = 1; H(n) = H(0) H(n-1) + H(1) H(n-2) + H(2) H(n-3) + H(n-2) H(1) + H(n-1) H(0) ; ->
6、 H(n) = (1/ (n+1) * C (n, 2n) 3. 第二類Stirling數: s(n,k)表示含n個元素的集合劃分為k個集合的情況數 A.分類:集合An存在,則有s(n-1,k-1); 不存在則An和放入k個集合中的任意一個,共k*s(n-1,k)種。 0 (k=0 or n<k) s(n,k)= s(n-1,k-1)+k*s(n-1,k) (n>k>=1) *:求一個集合總的劃分數即為sigema(k=1.n) s(n,k) . 4數字劃分模型 *NOIP2001數的劃分 將整數n分成k份,且每份不能為空,任意兩種分法不能相同(不考慮順序)。 d0,0:=1
7、; for p:=1 to n do for i:=p to n do for j:=k downto 1 do inc(di,j,di-p,j-1); writeln(dn,k); *變形1:考慮順序 d i, j : = d i-k, j-1 (k=1.i) *變形2:若分解出來的每個數均有一個上限m d i, j : = d i-k, j-1 (k=1.m) 5錯位排列 d1 = 0; d2 = 1; dn = (n-1) * (dn-1 + dn-2) 二、圖論與計算幾何 1度邊定理: sigema di = 2*E 2.三角形面積 |x1 y1 1| s=|x2 y2 1|=x1y2
8、+x2y3+x3y1-x3y2-x2y1-x1y3 |x3 y3 1| *海倫公式: 令p=(a+b+c)/2, 則S=sqrt(p*(p-a)*(p-b)*(p-c); 三、組合公式 1長度為n的0-1串中最多含k個1的 例 長度為N (N<=31)的01串中1的個數小于等于L的串組成的集合中找出按大小排序后的第I個01串。 2給定序列入棧出棧后可形成的情況總數為C(n,2n) C(n-1,2n)+1. 例 fjoi2000 在一個列車調度站中,2條軌道連接到2條側軌處,形成2個鐵路轉軌站,如下圖所示。其中左邊軌道為車皮入口,右邊軌道為出口。編號為1,2,n的N個車皮從入口依次進入轉軌
9、站,由調度室安排車皮進出棧次序,并對車皮按其出棧次序重新編序a1,a2,an。 給定正整數N(1<=n<=300),編程計算右邊軌道最多可以得到多少個不同的車皮編序方案。 例如當n=3時,最多得到6組不同的編序方案。 四、數論公式 1模取冪ab mod n= (.(a mod b)*a) mod b)*a.) mod b; 2n的約數的個數 若n滿足n=a1n1 * a2n2 * a3n3 * . * amnm,則n約數的個數為 (n1+1)(n2+1)(n3+1).(nm+1) 3費馬小定理若n為質數 pn = p (mod n) 算法部分一、數論算法 1求兩數的最大公約數 fu
10、nction 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 a<b then swap(a,b); lcm:=a; while lcm mod b>0 do inc(lcm,a); end; 3素數的求法 A.小范圍內判斷一個數是否為質數: function prime (n: integer): Boolean; var I: integer; beg
11、in 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<50000 do begin if pi then begin j:=i
12、*2; while j<50000 do begin pj:=false; inc(j,i); end; end; inc(i); end; l:=0; for i:=1 to 50000 do if pi then begin inc(l);prl:=i; end; end;getprime function prime(x:longint):integer; var i:integer; begin prime:=false; for i:=1 to l do if pri>=x then break else if x mod pri=0 then exit; prime:=
13、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 lowcosti:=costv0,i; closesti:=v0; end; for i:=1 to n-1 do begin 尋找離生成樹最近的未加入頂點k min:=maxlongint; for j:=1 to n do if (lowcostj<min) and (
14、lowcostj<>0) then begin min:=lowcostj; k:=j; end; lowcostk:=0; 將頂點k加入生成樹 生成樹中增加一條新的邊k到closestk 修正各點的lowcost和closest值 for j:=1 to n do if costk,j<lwocostj then begin lowcostj:=costk,j; closestj:=k; end; end; end;prim B.Kruskal算法:(貪心) 按權值遞增順序刪去圖中的邊,若不形成回路則將此邊加入最小生成樹。 function find(v:integer):
15、integer; 返回頂點v所在的集合 var i:integer; begin i:=1; while (i<=n) and (not v in vseti) do inc(i); if i<=n then find:=i else find:=0; end; procedure kruskal; var tot,i,j:integer; begin for i:=1 to n do vseti:=i;初始化定義n個集合,第I個集合包含一個元素I p:=n-1; q:=1; tot:=0; p為尚待加入的邊數,q為邊集指針 sort; 對所有邊按權值遞增排序,存于eI中,eI.v
16、1與eI.v2為邊I所連接的兩個頂點的序號,eI.len為第I條邊的長度 while p>0 do begin i:=find(eq.v1);j:=find(eq.v2); if i<>j then begin inc(tot,eq.len); vseti:=vseti+vsetj;vsetj:=; dec(p); end; inc(q); end; writeln(tot); end; 2.最短路徑 A.標號法求解單源點最短路徑: var a:array1.maxn,1.maxn of integer; b:array1.maxn of integer; bi指頂點i到源點
17、的最短路徑 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 marki then 對每一個已計算出最短路徑的點 for j:=1 to n do if (not markj) and (ai,j>0) then if (best=0) or (bi+ai,j<best) then begin b
18、est:=bi+ai,j; best_j:=j; end; if best>0 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,j>0 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
19、for j:=1 to n do if ai,k+aj,k<ai,j then 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; prei指最短路徑上I的前驅結點 mark:array1.maxn of boolean; procedure dijkstra(v0:integer); begin fillchar(mark,sizeof(mark),false); for i:=1 t
20、o n do begin di:=av0,i; if di<>0 then prei:=v0 else prei:=0; end; markv0:=true; repeat 每循環(huán)一次加入一個離1集合最近的結點并調整其他結點的參數 min:=maxint; u:=0; u記錄離1集合最近的結點 for i:=1 to n do if (not marki) and (di<min) then begin u:=i; min:=di; end; if u<>0 then begin marku:=true; for i:=1 to n do if (not mark
21、i) and (au,i+du<di) then begin di:=au,i+du; prei:=u; end; end; until u=0; end; 3.計算圖的傳遞閉包 Procedure Longlink; Var T:array1.maxn,1.maxn of boolean; Begin Fillchar(t,sizeof(t),false); For k:=1 to n do For I:=1 to n do For j:=1 to n do TI,j:=tI,j or (tI,k and tk,j); End; 4無向圖的連通分量 A.深度優(yōu)先 procedure d
22、fs ( now,color: integer); begin for i:=1 to n do if anow,i and ci=0 then begin 對結點I染色 ci:=color; dfs(I,color); end; end; B 寬度優(yōu)先(種子染色法) 5關鍵路徑 幾個定義: 頂點1為源點,n為匯點。 a. 頂點事件最早發(fā)生時間Vej, Ve j = max Ve j + wI,j ,其中Ve (1) = 0; b. 頂點事件最晚發(fā)生時間Vlj, Vl j = min Vlj wI,j ,其中Vl(n) = Ve(n); c. 邊活動最早開始時間EeI, 若邊I由<j,k
23、>表示,則EeI = Vej; d. 邊活動最晚開始時間ElI, 若邊I由<j,k>表示,則ElI = Vlk wj,k; 若Eej = Elj ,則活動j為關鍵活動,由關鍵活動組成的路徑為關鍵路徑。 求解方法: a. 從源點起topsort,判斷是否有回路并計算Ve; b. 從匯點起topsort,求Vl; c. 算Ee 和El; 6拓撲排序 找入度為0的點,刪去與其相連的所有邊,不斷重復這一過程。 例尋找一數列,其中任意連續(xù)p項之和為正,任意q 項之和為負,若不存在則輸出NO. 7.回路問題 Euler回路(DFS) 定義:經過圖的每條邊僅一次的回路。(充要條件:圖連同且
24、無奇點) Hamilton回路 定義:經過圖的每個頂點僅一次的回路。 一筆畫 充要條件:圖連通且奇點個數為0個或2個。 9判斷圖中是否有負權回路Bellman-ford 算法 xI,yI,tI分別表示第I條邊的起點,終點和權。共n個結點和m條邊。 procedure bellman-ford begin for I:=0 to n-1 do dI:=+infinitive; d0:=0; for I:=1 to n-1 do for j:=1 to m do 枚舉每一條邊 if dxj+tj<dyj then dyj:=dxj+tj; for I:=1 to m do if dxj+tj
25、<dyj then return false else return true; end; 10第n最短路徑問題 *第二最短路徑:每舉最短路徑上的每條邊,每次刪除一條,然后求新圖的最短路徑,取這些路徑中最短的一條即為第二最短路徑。 *同理,第n最短路徑可在求解第n-1最短路徑的基礎上求解。 三、背包問題 *部分背包問題可有貪心法求解:計算Pi/Wi 數據結構: wi:第i個背包的重量; pi:第i個背包的價值; 10-1背包: 每個背包只能使用一次或有限次(可轉化為一次): A.求最多可放入的重量。 NOIP2001 裝箱問題 有一個箱子容量為v(正整數,ov20000),同時有n個物品
26、(on30),每個物品有一個體積(正整數)。要求從n 個物品中,任取若千個裝入箱內,使箱子的剩余空間為最小。 搜索方法 procedure search(k,v:integer); 搜索第k個物品,剩余空間為v var i,j:integer; begin if v<best then best:=v; if v-(sn-sk-1)>=best then exit; sn為前n個物品的重量和 if k<=n then begin if v>wk then search(k+1,v-wk); search(k+1,v); end; end; DP FI,j為前i個物品中選
27、擇若干個放入使其體積正好為j的標志,為布爾型。 實現:將最優(yōu)化問題轉化為判定性問題 f I, j = f i-1, j-wi (wI<=j<=v) 邊界:f0,0:=true. For I:=1 to n do For j:=wI to v do FI,j:=fI-1,j-wI; 優(yōu)化:當前狀態(tài)只與前一階段狀態(tài)有關,可降至一維。 F0:=true; For I:=1 to n do begin F1:=f; For j:=wI to v do If fj-wI then f1j:=true; F:=f1; End; B.求可以放入的最大價值。 FI,j 為容量為I時取前j個背包所能
28、獲得的最大價值。 F i,j = max f i w j , j-1 + p j , f i,j-1 C.求恰好裝滿的情況數。 DP: Procedure update; var j,k:integer; begin c:=a; for j:=0 to n do if aj>0 then if j+now<=n then inc(cj+now,aj); a:=c; end; 2可重復背包 A求最多可放入的重量。 FI,j為前i個物品中選擇若干個放入使其體積正好為j的標志,為布爾型。 狀態(tài)轉移方程為 fI,j = f I-1, j wI*k (k=1. j div wI) B.求可以
29、放入的最大價值。 USACO 1.2 Score Inflation 進行一次競賽,總時間T固定,有若干種可選擇的題目,每種題目可選入的數量不限,每種題目有一個ti(解答此題所需的時間)和一個si(解答此題所得的分數),現要選擇若干題目,使解這些題的總時間在T以內的前提下,所得的總分最大,求最大的得分。 *易想到: fi,j = max f i- k*wj, j-1 + k*pj (0<=k<= i div wj) 其中fi,j表示容量為i時取前j種背包所能達到的最大值。 *實現: Begin FillChar(f,SizeOf(f),0); For i:=1 To M Do Fo
30、r j:=1 To N Do If i-problemj.time>=0 Then Begin t:=problemj.point+fi-problemj.time; If t>fi Then fi:=t; End; Writeln(fM); End. C.求恰好裝滿的情況數。 Ahoi2001 Problem2 求自然數n本質不同的質數和的表達式的數目。 思路一,生成每個質數的系數的排列,在一一測試,這是通法。 procedure try(dep:integer); var i,j:integer; begin cal; 此過程計算當前系數的計算結果,now為結果 if now&
31、gt;n 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 (rest<=0) or (dep=l+1) then begin if rest=0 then inc(tot); e
32、xit; end; for i:=0 to rest div prdep do try(dep+1,rest-prdep*i); end; main: try(1,n); 思路三:可使用動態(tài)規(guī)劃求解 USACO1.2 money system V個物品,背包容量為n,求放法總數。 轉移方程: Procedure update; var j,k:integer; begin c:=a; for j:=0 to n do if aj>0 then for k:=1 to n div now do if j+now*k<=n then inc(cj+now*k,aj); a:=c; en
33、d; main begin read(now); 讀入第一個物品的重量 i:=0; ai為背包容量為i時的放法總數 while i<=n do begin ai:=1; inc(i,now); end; 定義第一個物品重的整數倍的重量a值為1,作為初值 for i:=2 to v do begin read(now); update; 動態(tài)更新 end; writeln(an); 四、排序算法 1.快速排序: procedure qsort(l,r:integer); var i,j,mid:integer; begin i:=l;j:=r; mid:=a(l+r) div 2; rep
34、eat while ai<mid do inc(i); while aj>mid do dec(j);if i<=j then begin swap(ai,aj);inc(i);dec(j); end; until i>j; if l<j then qsort(l,j);if i<r then qsort(i,r); 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<aj-1 then s
35、wap( aj,aj-1); 每次比較相鄰元素的關系 end; E.堆排序: procedure sift(i,m:integer);調整以i為根的子樹成為堆,m為結點總數 var k:integer; begin a0:=ai; k:=2*i;在完全二叉樹中結點i的左孩子為2*i,右孩子為2*i+1 while k<=m do begin if (k<m) and (ak<ak+1) then inc(k);找出ak與ak+1中較大值 if a0<ak then begin ai:=ak;i:=k;k:=2*i; end else k:=m+1; end; ai:=a
36、0; 將根放在合適的位置 end; procedure heapsort; var j:integer; begin for j:=n div 2 downto 1 do sift(j,n); for j:=n downto 2 do begin swap(a1,aj); sift(1,j-1); end; end; 五、高精度計算 高精度數的定義: type hp=array1.maxlen of integer; 1高精度加法 procedure plus ( a,b:hp; var c:hp); var i,len:integer; begin fillchar(c,sizeof(c),
37、0); if a0>b0 then len:=a0 else len:=b0; for i:=1 to len do begin inc(ci,ai+bi); if ci>10 then begin dec(ci,10); inc(ci+1); end; 進位 end; if clen+1>0 then inc(len); c0:=len; end;plus 2高精度減法 procedure substract(a,b:hp;var c:hp); var i,len:integer; begin fillchar(c,sizeof(c),0); if a0>b0 the
38、n len:=a0 else len:=b0; for i:=1 to len do begin inc(ci,ai-bi); if ci<0 then begin inc(ci,10);dec(ci+1); end; while (len>1) 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
39、do begin inc(ci,ai*b); inc(ci+1,(ai*b) div 10); ci:=ci mod 10; end; inc(len); while (clen>=10) do begin 處理最高位的進位 clen+1:=clen div 10; clen:=clen mod 10; inc(len); end; while (len>1) and (clen=0) do dec(len); 若不需進位則調整len c0:=len; end;multiply 4高精度乘以高精度 procedure high_multiply(a,b:hp; var c:hp v
40、ar i,j,len:integer; begin fillchar(c,sizeof(c),0); for i:=1 to a0 do for j:=1 to b0 do begin inc(ci+j-1,ai*bj); inc(ci+j,ci+j-1 div 10); ci+j-1:=ci+j-1 mod 10; end; len:=a0+b0+1; while (len>1) and (clen=0) do dec(len); c0:=len; end; 5高精度除以低精度 procedure devide(a:hp;b:longint; var c:hp; var d:longi
41、nt); c:=a div b; d:= 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+ai; ci:=d div b; d:=d mod b; end; while (len>1) and (clen=0) then dec(len); c0:=len; end; 6高精度除以高精度 procedure high_devide(a,b:hp; var c,d:hp); var i,len:integer; begi
42、n fillchar(c,sizeof(c),0); fillchar(d,sizeof(d),0); len:=a0;d0:=1; for i:=len downto 1 do begin multiply(d,10,d); d1:=ai; while(compare(d,b)>=0) do 即d>=b begin Subtract(d,b,d); inc(ci); end; end; while(len>1)and(c.slen=0) do dec(len); c.len:=len; end; 六、樹的遍歷 1已知前序中序求后序 procedure Solve(pre,m
43、id:string); var i:integer; begin if (pre='') 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:integ
44、er; begin if (mid='') or (post='') then exit; i:=pos(postlength(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
45、,l:integer; p:boolean; begin ok:=true; l:=length(s1); for i:=1 to l do begin p:=false; for j:=1 to l do if s1i=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 i
46、nc(i); until ok(copy(pre,2,i),copy(post,1,i); solve(copy(pre,2,i),copy(post,1,i); midstr:=midstr+pre1; 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 八全排列與組合的生
47、成 1排列的生成:(1.n) procedure solve(dep:integer); var i:integer; begin if dep=n+1 then begin writeln(s);exit; end; for i:=1 to n do if not usedi then begin s:=s+chr(i+ord('0');usedi:=true; solve(dep+1); s:=copy(s,1,length(s)-1); usedi:=false; end; end; 2組合的生成(1.n中選取k個數的所有方案) procedure solve(dep,p
48、re:integer); var i:integer; begin if dep=k+1 then begin writeln(s);exit; end; for i:=1 to n do if (not usedi) and (i>pre) then begin s:=s+chr(i+ord('0');usedi:=true; solve(dep+1,i); s:=copy(s,1,length(s)-1); usedi:=false; end; end; 九.查找算法 1折半查找function binsearch(k:keytype):integer; var lo
49、w,hig,mid:integer; begin low:=1;hig:=n; mid:=(low+hig) div 2; while (amid.key<>k) and (low<=hig) do begin if amid.key>k then hig:=mid-1 else low:=mid+1; mid:=(low+hig) div 2; end; if low>hig then mid:=0; binsearch:=mid; end; 2樹形查找 二叉排序樹:每個結點的值都大于其左子樹任一結點的值而小于其右子樹任一結點的值。 查找 function tr
50、eesrh(k:keytype):pointer; var q:pointer; begin q:=root; while (q<>nil) and (q.key<>k) do if k<q.key then q:=q.left else q:=q.right; treesrh:=q; end; 十、貪心 *會議問題 (1) n個活動每個活動有一個開始時間和一個結束時間,任一時刻僅一項活動進行,求滿足活動數最多的情況。 解:按每項活動的結束時間進行排序,排在前面的優(yōu)先滿足。 (2)會議室空閑時間最少。 (3)每個客戶有一個愿付的租金,求最大利潤。 (4)共R間會議
51、室,第i個客戶需使用i間會議室,費用相同,求最大利潤。 十一、回溯法框架 1. n皇后問題 procedure try(i:byte); var j:byte; begin if i=n+1 then begin print;exit;end; for j:=1 to n do if ai and bj+i and cj-i then begin xi:=j; aj:=false; bj+i:=false; cj-i:=false; try(i+1); aj:=true; bi+j:=true; cj-i:=true; end; end; 2.Hanoi Tower h(n)=2*h(n-1)
52、+1 h(1)=1 初始所有銅片都在a柱上 procedure hanoi(n,a,b,c:byte); 將第n塊銅片從a柱通過b柱移到c柱上 begin if n=0 then exit; hanoi(n-1,a,c,b); 將上面的n-1塊從a柱通過c柱移到b柱上 write(n,moved from,a,to,c); hanoi(n-1,b,a,c); 將b上的n-1塊從b柱通過a柱移到c柱上 end; 初始銅片分布在3個柱上,給定目標柱goal h1.3,0.n存放三個柱的狀態(tài),now與nowp存最大的不到位的銅片的柱號和編號,hI,0存第I個柱上的個數。 Procedure move(k,goal:integer); 將最大不到位的k移到目標
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度養(yǎng)殖場農產品質量安全追溯合同
- 2024-2025學年湖北省黃岡市高二上學期普通高中12月聯考歷史試卷
- 2025年兼職會計實習生崗位協(xié)議書完整版
- 2025年北京龍湖租賃合同標準
- 2025年雙方數據互換保密協(xié)議
- 2025年鎳壓延加工材項目立項申請報告模范
- 2025年合作項目協(xié)商協(xié)議示例
- 2025年技術成果轉化服務項目立項申請報告模板
- 2025年分析儀器購買合同模板
- 2025年聲學懸浮物監(jiān)測儀項目規(guī)劃申請報告模板
- 2024-2025學年第二學期學??倓展ぷ饔媱潱ǜ?月-6月安排表行事歷)
- 交管12123學法減分題庫(含答案)
- 山東省濟南市槐蔭區(qū)2024-2025學年八年級上學期期末語文試題(含答案)
- 北京市海淀區(qū)2024-2025學年八年級上學期期末考試數學試卷(含答案)
- 23G409先張法預應力混凝土管樁
- 2025年廣西柳州市中級人民法院招錄聘用工作人員17人高頻重點提升(共500題)附帶答案詳解
- 2024年全國職業(yè)院校技能大賽高職組(研學旅行賽項)考試題庫(含答案)
- 《幼兒教育政策與法規(guī)》教案-單元5 幼兒的權利與保護
- 十八項核心制度
- 工程施工安全培訓教育
- 2024年08月浙江2024渤海銀行杭州分行秋季校園招考筆試歷年參考題庫附帶答案詳解
評論
0/150
提交評論