OI基本算法總結(jié)_第1頁
OI基本算法總結(jié)_第2頁
OI基本算法總結(jié)_第3頁
OI基本算法總結(jié)_第4頁
OI基本算法總結(jié)_第5頁
已閱讀5頁,還剩22頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、語言部分一、常用函數(shù)與過程: * abs(x):y 取x的絕對值,x與y可為整型或?qū)嵭汀?* frac(x):y 取x的小數(shù)部分,x與y均為實(shí)型。 * int(x):y 取x的整數(shù)部分,x與y均為實(shí)型,常寫成trunc(int(x). * random(x):y 在0-x之間的整數(shù)中隨機(jī)找一個(gè)整數(shù),x與y均為整型。 * sin(x):y; cos(x):y; arctan(x):y; exp(x):y; ln(x):y 均與數(shù)學(xué)運(yùn)算一致,三角函數(shù)返回的均為弧度,轉(zhuǎn)換成角度即乘以Pi除以180. * copy(str,n1,n2):substr 從字符串str中取從第n1個(gè)字符開始長度為n2個(gè)字

2、符的子串substr.n1和n2是整型表達(dá)式,如果n1大于s的長度,則返回空字符串。如果指定的n2大于第n1個(gè)字符后剩下的字符數(shù),則返回剩下的字符串。 * pos(substr,str):num 查找substr是否為str的子串,若是則返回substr在str中的起始位置,若否則返回0. * val(str,int,code) 將字串str轉(zhuǎn)為數(shù)值型數(shù)據(jù)存入int, 如果字符串無效,其中非法字符的下標(biāo)放在Code中;否則,code為零。 * str(num,str) 將num表達(dá)式轉(zhuǎn)成字符串str。 * delete( str,n1,n2) 從原字符串str中刪去一個(gè)從n1開始長度為n2的子

3、串,如果Index比s長,不刪除任何字符。如果指定的Count大于從第1ndex大到結(jié)尾的字符數(shù),刪除剩余部分。 * Insert(Source:String;Var S:String;Index:Integer) Source是字符串表達(dá)式。S是任意長度的字符串變量。Index是整型表達(dá)式。過程Insert把字符串Source插入字符串S中第1ndex個(gè)字符開始的位置上。如果字符串比255個(gè)字符長,則將第255后面的字符截去。* FileSize(var f:text):longint 返回文件字節(jié)數(shù)。 * Flush(f:text) 如果正文文件由Rewr比和Append打開用來輸出,則對

4、F1ush的調(diào)用將騰空文件緩沖區(qū),這保證寫向文件的字符實(shí)際寫到外部文件上。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.標(biāo)識符不能以數(shù)字開頭,其中不能有空格,點(diǎn)等符號。 5.說明部分順序: Lable - Const - type - Var - Procedure (Function) 6.通常編譯器只能識別標(biāo)識符的前8個(gè)字符。 7.規(guī)定false=0,true=1; 8.

5、除實(shí)型外其他均為左留空,右看齊,實(shí)型向小數(shù)點(diǎn)看齊。 9實(shí)型默認(rèn)場寬:17位 符號位+11位數(shù)字與一位小數(shù)點(diǎn)+E+00 數(shù)學(xué)部分一、常見遞推關(guān)系 1.Fibonacci 數(shù)列 A(1)=1; A(2)=1; A(n)=A(n-1) + A(n-2); 2.Catalan數(shù): 考慮具有n個(gè)結(jié)點(diǎn)不同形態(tài)的二叉樹的個(gè)數(shù)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) ; - H(n) = (1/ (n+1) * C (n, 2n) 3. 第二類Stirling數(shù): s(n

6、,k)表示含n個(gè)元素的集合劃分為k個(gè)集合的情況數(shù) A.分類:集合An存在,則有s(n-1,k-1); 不存在則An和放入k個(gè)集合中的任意一個(gè),共k*s(n-1,k)種。 0 (k=0 or nk=1) *:求一個(gè)集合總的劃分?jǐn)?shù)即為sigema(k=1.n) s(n,k) . 4數(shù)字劃分模型 *NOIP2001數(shù)的劃分 將整數(shù)n分成k份,且每份不能為空,任意兩種分法不能相同(不考慮順序)。 d0,0:=1; 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:

7、考慮順序 d i, j : = d i-k, j-1 (k=1.i) *變形2:若分解出來的每個(gè)數(shù)均有一個(gè)上限m d i, j : = d i-k, j-1 (k=1.m) 5錯(cuò)位排列 d1 = 0; d2 = 1; dn = (n-1) * (dn-1 + dn-2) 二、圖論與計(jì)算幾何 1度邊定理: sigema di = 2*E 2.三角形面積 |x1 y1 1| s=|x2 y2 1|=x1y2+x2y3+x3y1-x3y2-x2y1-x1y3 |x3 y3 1| *海倫公式: 令p=(a+b+c)/2, 則S=sqrt(p*(p-a)*(p-b)*(p-c); 三、組合公式 1長度為

8、n的0-1串中最多含k個(gè)1的 例 長度為N (N=31)的01串中1的個(gè)數(shù)小于等于L的串組成的集合中找出按大小排序后的第I個(gè)01串。 2給定序列入棧出棧后可形成的情況總數(shù)為C(n,2n) C(n-1,2n)+1. 例 fjoi2000 在一個(gè)列車調(diào)度站中,2條軌道連接到2條側(cè)軌處,形成2個(gè)鐵路轉(zhuǎn)軌站,如下圖所示。其中左邊軌道為車皮入口,右邊軌道為出口。編號為1,2,n的N個(gè)車皮從入口依次進(jìn)入轉(zhuǎn)軌站,由調(diào)度室安排車皮進(jìn)出棧次序,并對車皮按其出棧次序重新編序a1,a2,an。 給定正整數(shù)N(1=n=300),編程計(jì)算右邊軌道最多可以得到多少個(gè)不同的車皮編序方案。 例如當(dāng)n=3時(shí),最多得到6組不同的

9、編序方案。 四、數(shù)論公式 1模取冪ab mod n= (.(a mod b)*a) mod b)*a.) mod b; 2n的約數(shù)的個(gè)數(shù) 若n滿足n=a1n1 * a2n2 * a3n3 * . * amnm,則n約數(shù)的個(gè)數(shù)為 (n1+1)(n2+1)(n3+1).(nm+1) 3費(fèi)馬小定理若n為質(zhì)數(shù) pn = p (mod n) 算法部分一、數(shù)論算法 1求兩數(shù)的最大公約數(shù) function gcd(a,b:integer):integer; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod b); end ; 2求兩數(shù)的最小公倍數(shù) functio

10、n lcm(a,b:integer):integer; begin if a0 do inc(lcm,a); end; 3素?cái)?shù)的求法 A.小范圍內(nèi)判斷一個(gè)數(shù)是否為質(zhì)數(shù): function prime (n: integer): Boolean; var I: integer; begin 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范圍內(nèi)的數(shù)是否為素?cái)?shù)(包含求50000以內(nèi)的素?cái)?shù)表): procedure getprime;

11、var i,j:longint; p:array1.50000 of boolean; begin fillchar(p,sizeof(p),true); p1:=false; i:=2; while i50000 do begin if pi then begin j:=i*2; while j=x then break else if x mod pri=0 then exit; prime:=true; end;prime 二、圖論算法 1最小生成樹 A.Prim算法: procedure prim(v0:integer); var lowcost,closest:array1.maxn

12、 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 尋找離生成樹最近的未加入頂點(diǎn)k min:=maxlongint; for j:=1 to n do if (lowcostjmin) and (lowcostj0) then begin min:=lowcostj; k:=j; end; lowcostk:=0; 將頂點(diǎn)k加入生成樹 生成樹中增加一條新的邊k到closestk 修正各點(diǎn)的lowco

13、st和closest值 for j:=1 to n do if costk,jlwocostj then begin lowcostj:=costk,j; closestj:=k; end; end; end;prim B.Kruskal算法:(貪心) 按權(quán)值遞增順序刪去圖中的邊,若不形成回路則將此邊加入最小生成樹。 function find(v:integer):integer; 返回頂點(diǎn)v所在的集合 var i:integer; begin i:=1; while (i=n) and (not v in vseti) do inc(i); if i0 do begin i:=find(e

14、q.v1);j:=find(eq.v2); if ij then begin inc(tot,eq.len); vseti:=vseti+vsetj;vsetj:=; dec(p); end; inc(q); end; writeln(tot); end; 2.最短路徑 A.標(biāo)號法求解單源點(diǎn)最短路徑: var a:array1.maxn,1.maxn of integer; b:array1.maxn of integer; bi指頂點(diǎn)i到源點(diǎn)的最短路徑 mark:array1.maxn of boolean; procedure bhf; var best,best_j:integer; b

15、egin fillchar(mark,sizeof(mark),false); mark1:=true; b1:=0;1為源點(diǎn) repeat best:=0; for i:=1 to n do If marki then 對每一個(gè)已計(jì)算出最短路徑的點(diǎn) for j:=1 to n do if (not markj) and (ai,j0) then if (best=0) or (bi+ai,j0 then begin bbest_j:=best;markbest_j:=true; end; until best=0; end;bhf B.Floyed算法求解所有頂點(diǎn)對之間的最短路徑: proc

16、edure 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(luò)的最短路徑上j的前驅(qū)結(jié)點(diǎn) for k:=1 to n do 枚舉中間結(jié)點(diǎn) for i:=1 to n do for j:=1 to n do if ai,k+aj,kai,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:arra

17、y1.maxn of integer; prei指最短路徑上I的前驅(qū)結(jié)點(diǎn) mark:array1.maxn of boolean; procedure dijkstra(v0:integer); begin fillchar(mark,sizeof(mark),false); for i:=1 to n do begin di:=av0,i; if di0 then prei:=v0 else prei:=0; end; markv0:=true; repeat 每循環(huán)一次加入一個(gè)離1集合最近的結(jié)點(diǎn)并調(diào)整其他結(jié)點(diǎn)的參數(shù) min:=maxint; u:=0; u記錄離1集合最近的結(jié)點(diǎn) for i

18、:=1 to n do if (not marki) and (dimin) then begin u:=i; min:=di; end; if u0 then begin marku:=true; for i:=1 to n do if (not marki) and (au,i+dudi) then begin di:=au,i+du; prei:=u; end; end; until u=0; end; 3.計(jì)算圖的傳遞閉包 Procedure Longlink; Var T:array1.maxn,1.maxn of boolean; Begin Fillchar(t,sizeof(t

19、),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 dfs ( now,color: integer); begin for i:=1 to n do if anow,i and ci=0 then begin 對結(jié)點(diǎn)I染色 ci:=color; dfs(I,color); end; end; B 寬度優(yōu)先(種子染色法) 5關(guān)鍵路徑 幾個(gè)定義: 頂點(diǎn)1為源點(diǎn),n為匯點(diǎn)。 a. 頂點(diǎn)事件最早發(fā)生時(shí)間Ve

20、j, Ve j = max Ve j + wI,j ,其中Ve (1) = 0; b. 頂點(diǎn)事件最晚發(fā)生時(shí)間Vlj, Vl j = min Vlj wI,j ,其中Vl(n) = Ve(n); c. 邊活動最早開始時(shí)間EeI, 若邊I由表示,則EeI = Vej; d. 邊活動最晚開始時(shí)間ElI, 若邊I由表示,則ElI = Vlk wj,k; 若Eej = Elj ,則活動j為關(guān)鍵活動,由關(guān)鍵活動組成的路徑為關(guān)鍵路徑。 求解方法: a. 從源點(diǎn)起topsort,判斷是否有回路并計(jì)算Ve; b. 從匯點(diǎn)起topsort,求Vl; c. 算Ee 和El; 6拓?fù)渑判?找入度為0的點(diǎn),刪去與其相連

21、的所有邊,不斷重復(fù)這一過程。 例尋找一數(shù)列,其中任意連續(xù)p項(xiàng)之和為正,任意q 項(xiàng)之和為負(fù),若不存在則輸出NO. 7.回路問題 Euler回路(DFS) 定義:經(jīng)過圖的每條邊僅一次的回路。(充要條件:圖連同且無奇點(diǎn)) Hamilton回路 定義:經(jīng)過圖的每個(gè)頂點(diǎn)僅一次的回路。 一筆畫 充要條件:圖連通且奇點(diǎn)個(gè)數(shù)為0個(gè)或2個(gè)。 9判斷圖中是否有負(fù)權(quán)回路Bellman-ford 算法 xI,yI,tI分別表示第I條邊的起點(diǎn),終點(diǎn)和權(quán)。共n個(gè)結(jié)點(diǎn)和m條邊。 procedure bellman-ford begin for I:=0 to n-1 do dI:=+infinitive; d0:=0; f

22、or I:=1 to n-1 do for j:=1 to m do 枚舉每一條邊 if dxj+tjdyj then dyj:=dxj+tj; for I:=1 to m do if dxj+tjdyj then return false else return true; end; 10第n最短路徑問題 *第二最短路徑:每舉最短路徑上的每條邊,每次刪除一條,然后求新圖的最短路徑,取這些路徑中最短的一條即為第二最短路徑。 *同理,第n最短路徑可在求解第n-1最短路徑的基礎(chǔ)上求解。 三、背包問題 *部分背包問題可有貪心法求解:計(jì)算Pi/Wi 數(shù)據(jù)結(jié)構(gòu): wi:第i個(gè)背包的重量; pi:第i個(gè)背

23、包的價(jià)值; 10-1背包: 每個(gè)背包只能使用一次或有限次(可轉(zhuǎn)化為一次): A.求最多可放入的重量。 NOIP2001 裝箱問題 有一個(gè)箱子容量為v(正整數(shù),ov20000),同時(shí)有n個(gè)物品(on30),每個(gè)物品有一個(gè)體積(正整數(shù))。要求從n 個(gè)物品中,任取若千個(gè)裝入箱內(nèi),使箱子的剩余空間為最小。 搜索方法 procedure search(k,v:integer); 搜索第k個(gè)物品,剩余空間為v var i,j:integer; begin if v=best then exit; sn為前n個(gè)物品的重量和 if kwk then search(k+1,v-wk); search(k+1,v

24、); end; end; DP FI,j為前i個(gè)物品中選擇若干個(gè)放入使其體積正好為j的標(biāo)志,為布爾型。 實(shí)現(xiàn):將最優(yōu)化問題轉(zhuǎn)化為判定性問題 f I, j = f i-1, j-wi (wI=j0 then if j+now=n then inc(cj+now,aj); a:=c; end; 2可重復(fù)背包 A求最多可放入的重量。 FI,j為前i個(gè)物品中選擇若干個(gè)放入使其體積正好為j的標(biāo)志,為布爾型。 狀態(tài)轉(zhuǎn)移方程為 fI,j = f I-1, j wI*k (k=1. j div wI) B.求可以放入的最大價(jià)值。 USACO 1.2 Score Inflation 進(jìn)行一次競賽,總時(shí)間T固定,

25、有若干種可選擇的題目,每種題目可選入的數(shù)量不限,每種題目有一個(gè)ti(解答此題所需的時(shí)間)和一個(gè)si(解答此題所得的分?jǐn)?shù)),現(xiàn)要選擇若干題目,使解這些題的總時(shí)間在T以內(nèi)的前提下,所得的總分最大,求最大的得分。 *易想到: fi,j = max f i- k*wj, j-1 + k*pj (0=k=0 Then Begin t:=problemj.point+fi-problemj.time; If tfi Then fi:=t; End; Writeln(fM); End. C.求恰好裝滿的情況數(shù)。 Ahoi2001 Problem2 求自然數(shù)n本質(zhì)不同的質(zhì)數(shù)和的表達(dá)式的數(shù)目。 思路一,生成每個(gè)

26、質(zhì)數(shù)的系數(shù)的排列,在一一測試,這是通法。 procedure try(dep:integer); var i,j:integer; begin cal; 此過程計(jì)算當(dāng)前系數(shù)的計(jì)算結(jié)果,now為結(jié)果 if nown then exit; 剪枝 if dep=l+1 then begin 生成所有系數(shù) 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

27、: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+now*k,aj); a:=c; end; main begin read(now); 讀入第一個(gè)物品的重量 i:=0; ai為背包容量為i時(shí)的放法總數(shù) while i=n do begin ai:=1; inc(i,now); end; 定義第一個(gè)物品重的整數(shù)倍的重量a值為1,作為初值 for i:=2 to v do begin read(now); update; 動態(tài)更新 end; wr

28、iteln(an); 四、排序算法 1.快速排序: procedure qsort(l,r:integer); var i,j,mid:integer; begin i:=l;j:=r; mid:=a(l+r) div 2; repeat while aimid do dec(j);if ij; if lj then qsort(l,j);if ir 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 a

29、jaj-1 then swap( aj,aj-1); 每次比較相鄰元素的關(guān)系 end; E.堆排序: procedure sift(i,m:integer);調(diào)整以i為根的子樹成為堆,m為結(jié)點(diǎn)總數(shù) var k:integer; begin a0:=ai; k:=2*i;在完全二叉樹中結(jié)點(diǎn)i的左孩子為2*i,右孩子為2*i+1 while k=m do begin if (km) and (akak+1) then inc(k);找出ak與ak+1中較大值 if a0b0 then len:=a0 else len:=b0; for i:=1 to len do begin inc(ci,ai+

30、bi); if ci10 then begin dec(ci,10); inc(ci+1); end; 進(jìn)位 end; if clen+10 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 a0b0 then len:=a0 else len:=b0; for i:=1 to len do begin inc(ci,ai-bi); if ci1) and (clen=0) do de

31、c(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 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 處理最高位的進(jìn)位 clen+1:=clen div 10; clen:=clen mod

32、10; inc(len); end; while (len1) and (clen=0) do dec(len); 若不需進(jìn)位則調(diào)整len c0:=len; end;multiply 4高精度乘以高精度 procedure high_multiply(a,b:hp; var c:hp var 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

33、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:= 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;

34、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); 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 Subtra

35、ct(d,b,d); inc(ci); 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 (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

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

37、(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:=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

38、 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+pre1; solve(copy(pre,i+2,length(pre)-i-1),copy(post,i+1,length(post)-i-1); end; 七進(jìn)制轉(zhuǎn)換 1任意正整數(shù)進(jìn)制間的互化 除n取余 2實(shí)數(shù)任意正整數(shù)進(jìn)制間的互化 乘n取整 3負(fù)數(shù)進(jìn)制: 設(shè)計(jì)一個(gè)程序,讀

39、入一個(gè)十進(jìn)制數(shù)的基數(shù)和一個(gè)負(fù)進(jìn)制數(shù)的基數(shù),并將此十進(jìn)制數(shù)轉(zhuǎn)換為此負(fù)進(jìn)制下的數(shù):-R-2,-3,-4,.-20 八全排列與組合的生成 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;

40、end; end; 2組合的生成(1.n中選取k個(gè)數(shù)的所有方案) 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 usedi) and (ipre) 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折半查找funct

41、ion binsearch(k:keytype):integer; var low,hig,mid:integer; begin low:=1;hig:=n; mid:=(low+hig) div 2; while (amid.keyk) and (lowk then hig:=mid-1 else low:=mid+1; mid:=(low+hig) div 2; end; if lowhig then mid:=0; binsearch:=mid; end; 2樹形查找 二叉排序樹:每個(gè)結(jié)點(diǎn)的值都大于其左子樹任一結(jié)點(diǎn)的值而小于其右子樹任一結(jié)點(diǎn)的值。 查找 function treesrh(

42、k:keytype):pointer; var q:pointer; begin q:=root; while (qnil) and (q.keyk) do if kq.key then q:=q.left else q:=q.right; treesrh:=q; end; 十、貪心 *會議問題 (1) n個(gè)活動每個(gè)活動有一個(gè)開始時(shí)間和一個(gè)結(jié)束時(shí)間,任一時(shí)刻僅一項(xiàng)活動進(jìn)行,求滿足活動數(shù)最多的情況。 解:按每項(xiàng)活動的結(jié)束時(shí)間進(jìn)行排序,排在前面的優(yōu)先滿足。 (2)會議室空閑時(shí)間最少。 (3)每個(gè)客戶有一個(gè)愿付的租金,求最大利潤。 (4)共R間會議室,第i個(gè)客戶需使用i間會議室,費(fèi)用相同,求最大利潤

43、。 十一、回溯法框架 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)+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個(gè)柱上,給定目標(biāo)柱goal h1.3,0.n存放三個(gè)柱的狀態(tài),no

溫馨提示

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

評論

0/150

提交評論