![OI基本算法總結(jié)_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf1.gif)
![OI基本算法總結(jié)_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf2.gif)
![OI基本算法總結(jié)_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf3.gif)
![OI基本算法總結(jié)_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf4.gif)
![OI基本算法總結(jié)_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/5/405ceadc-9590-4671-9db8-b27b557798bf/405ceadc-9590-4671-9db8-b27b557798bf5.gif)
版權(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í)符不能以數(shù)字開頭,其中不能有空格,點(diǎn)等符號(hào)。 5.說明部分順序: Lable -> Const -> type -> Var -> Procedure (Function
5、) 6.通常編譯器只能識(shí)別標(biāo)識(shí)符的前8個(gè)字符。 7.規(guī)定false=0,true=1; 8.除實(shí)型外其他均為左留空,右看齊,實(shí)型向小數(shù)點(diǎn)看齊。 9實(shí)型默認(rèn)場寬:17位 符號(hào)位+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) ; ->
6、 H(n) = (1/ (n+1) * C (n, 2n) 3. 第二類Stirling數(shù): s(n,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 n<k) s(n,k)= s(n-1,k-1)+k*s(n-1,k) (n>k>=1) *:求一個(gè)集合總的劃分?jǐn)?shù)即為sigema(k=1.n) s(n,k) . 4數(shù)字劃分模型 *NOIP2001數(shù)的劃分 將整數(shù)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:若分解出來的每個(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
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個(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)軌站,如下圖所示。其中左邊軌道為車皮入口,右邊軌道為出口。編號(hào)為1,2,n的N個(gè)車皮從入口依次進(jìn)入轉(zhuǎn)軌
9、站,由調(diào)度室安排車皮進(jìn)出棧次序,并對車皮按其出棧次序重新編序a1,a2,an。 給定正整數(shù)N(1<=n<=300),編程計(jì)算右邊軌道最多可以得到多少個(gè)不同的車皮編序方案。 例如當(dāng)n=3時(shí),最多得到6組不同的編序方案。 四、數(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ù) fu
10、nction gcd(a,b:integer):integer; begin if b=0 then gcd:=a else gcd:=gcd (b,a mod b); end ; 2求兩數(shù)的最小公倍數(shù) 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素?cái)?shù)的求法 A.小范圍內(nèi)判斷一個(gè)數(shù)是否為質(zhì)數(shù): 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范圍內(nèi)的數(shù)是否為素?cái)?shù)(包含求50000以內(nèi)的素?cái)?shù)表): 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 尋找離生成樹最近的未加入頂點(diǎn)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; 將頂點(diǎn)k加入生成樹 生成樹中增加一條新的邊k到closestk 修正各點(diǎn)的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算法:(貪心) 按權(quán)值遞增順序刪去圖中的邊,若不形成回路則將此邊加入最小生成樹。 function find(v:integer):
15、integer; 返回頂點(diǎn)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個(gè)集合,第I個(gè)集合包含一個(gè)元素I p:=n-1; q:=1; tot:=0; p為尚待加入的邊數(shù),q為邊集指針 sort; 對所有邊按權(quán)值遞增排序,存于eI中,eI.v
16、1與eI.v2為邊I所連接的兩個(gè)頂點(diǎn)的序號(hào),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.標(biāo)號(hào)法求解單源點(diǎn)最短路徑: var a:array1.maxn,1.maxn of integer; b:array1.maxn of integer; bi指頂點(diǎn)i到源點(diǎn)
17、的最短路徑 mark:array1.maxn of boolean; procedure bhf; var best,best_j:integer; begin 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,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算法求解所有頂點(diǎn)對之間的最短路徑: 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(luò)的最短路徑上j的前驅(qū)結(jié)點(diǎn) for k:=1 to n do 枚舉中間結(jié)點(diǎn) 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的前驅(qū)結(jié)點(diǎn) 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)一次加入一個(gè)離1集合最近的結(jié)點(diǎn)并調(diào)整其他結(jié)點(diǎn)的參數(shù) min:=maxint; u:=0; u記錄離1集合最近的結(jié)點(diǎn) 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.計(jì)算圖的傳遞閉包 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 對結(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í)間Vej, 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. 邊活動(dòng)最早開始時(shí)間EeI, 若邊I由<j,k
23、>表示,則EeI = Vej; d. 邊活動(dòng)最晚開始時(shí)間ElI, 若邊I由<j,k>表示,則ElI = Vlk wj,k; 若Eej = Elj ,則活動(dòng)j為關(guān)鍵活動(dòng),由關(guān)鍵活動(dòng)組成的路徑為關(guān)鍵路徑。 求解方法: a. 從源點(diǎn)起topsort,判斷是否有回路并計(jì)算Ve; b. 從匯點(diǎn)起topsort,求Vl; c. 算Ee 和El; 6拓?fù)渑判?找入度為0的點(diǎn),刪去與其相連的所有邊,不斷重復(fù)這一過程。 例尋找一數(shù)列,其中任意連續(xù)p項(xiàng)之和為正,任意q 項(xiàng)之和為負(fù),若不存在則輸出NO. 7.回路問題 Euler回路(DFS) 定義:經(jīng)過圖的每條邊僅一次的回路。(充要條件:圖連同且
24、無奇點(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; 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最短路徑的基礎(chǔ)上求解。 三、背包問題 *部分背包問題可有貪心法求解:計(jì)算Pi/Wi 數(shù)據(jù)結(jié)構(gòu): wi:第i個(gè)背包的重量; pi:第i個(gè)背包的價(jià)值; 10-1背包: 每個(gè)背包只能使用一次或有限次(可轉(zhuǎn)化為一次): A.求最多可放入的重量。 NOIP2001 裝箱問題 有一個(gè)箱子容量為v(正整數(shù),ov20000),同時(shí)有n個(gè)物品
26、(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 best:=v; if v-(sn-sk-1)>=best then exit; sn為前n個(gè)物品的重量和 if k<=n then begin if v>wk then search(k+1,v-wk); search(k+1,v); end; end; DP FI,j為前i個(gè)物品中選
27、擇若干個(gè)放入使其體積正好為j的標(biāo)志,為布爾型。 實(shí)現(xiàn):將最優(yōu)化問題轉(zhuǎn)化為判定性問題 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)化:當(dāng)前狀態(tài)只與前一階段狀態(tài)有關(guān),可降至一維。 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.求可以放入的最大價(jià)值。 FI,j 為容量為I時(shí)取前j個(gè)背包所能
28、獲得的最大價(jià)值。 F i,j = max f i w j , j-1 + p j , f i,j-1 C.求恰好裝滿的情況數(shù)。 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可重復(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.求可以
29、放入的最大價(jià)值。 USACO 1.2 Score Inflation 進(jìn)行一次競賽,總時(shí)間T固定,有若干種可選擇的題目,每種題目可選入的數(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<= i div wj) 其中fi,j表示容量為i時(shí)取前j種背包所能達(dá)到的最大值。 *實(shí)現(xiàn): 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.求恰好裝滿的情況數(shù)。 Ahoi2001 Problem2 求自然數(shù)n本質(zhì)不同的質(zhì)數(shù)和的表達(dá)式的數(shù)目。 思路一,生成每個(gè)質(zhì)數(shù)的系數(shù)的排列,在一一測試,這是通法。 procedure try(dep:integer); var i,j:integer; begin cal; 此過程計(jì)算當(dāng)前系數(shù)的計(jì)算結(jié)果,now為結(jié)果 if now&
31、gt;n 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: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); 思路三:可使用動(dòng)態(tài)規(guī)劃求解 USACO1.2 money system V個(gè)物品,背包容量為n,求放法總數(shù)。 轉(zhuǎ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); 讀入第一個(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; 動(dòng)態(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); 每次比較相鄰元素的關(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 (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; 五、高精度計(jì)算 高精度數(shù)的定義: 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; 進(jìn)位 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 處理最高位的進(jìn)位 clen+1:=clen div 10; clen:=clen mod 10; inc(len); end; while (len>1) 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 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; 加上根,遞歸結(jié)束后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); 加上根,遞歸結(jié)束后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; 七進(jìn)制轉(zhuǎn)換 1任意正整數(shù)進(jìn)制間的互化 除n取余 2實(shí)數(shù)任意正整數(shù)進(jìn)制間的互化 乘n取整 3負(fù)數(shù)進(jìn)制: 設(shè)計(jì)一個(gè)程序,讀入一個(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 八全排列與組合的生
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個(gè)數(shù)的所有方案) 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樹形查找 二叉排序樹:每個(gè)結(jié)點(diǎn)的值都大于其左子樹任一結(jié)點(diǎn)的值而小于其右子樹任一結(jié)點(diǎn)的值。 查找 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; 十、貪心 *會(huì)議問題 (1) n個(gè)活動(dòng)每個(gè)活動(dòng)有一個(gè)開始時(shí)間和一個(gè)結(jié)束時(shí)間,任一時(shí)刻僅一項(xiàng)活動(dòng)進(jìn)行,求滿足活動(dòng)數(shù)最多的情況。 解:按每項(xiàng)活動(dòng)的結(jié)束時(shí)間進(jìn)行排序,排在前面的優(yōu)先滿足。 (2)會(huì)議室空閑時(shí)間最少。 (3)每個(gè)客戶有一個(gè)愿付的租金,求最大利潤。 (4)共R間會(huì)議
51、室,第i個(gè)客戶需使用i間會(huì)議室,費(fè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個(gè)柱上,給定目標(biāo)柱goal h1.3,0.n存放三個(gè)柱的狀態(tài),now與nowp存最大的不到位的銅片的柱號(hào)和編號(hào),hI,0存第I個(gè)柱上的個(gè)數(shù)。 Procedure move(k,goal:integer); 將最大不到位的k移到目標(biāo)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 33223-2024軋制設(shè)備術(shù)語
- Target-Protein-Ligand-Linker-Conjugates-4-生命科學(xué)試劑-MCE-5926
- 1-2-Dihexanoyl-sn-glycero-3-PS-sodium-生命科學(xué)試劑-MCE-8684
- 二零二五年度離婚協(xié)議書中共同財(cái)產(chǎn)清算起訴狀
- 2025年度電力市場交易購售電合同
- 二零二五年度大型賽事活動(dòng)合作2025年度營銷合同
- 二零二五年度私人住宅裝修質(zhì)量與安全雙保障協(xié)議
- 2025年度離婚子女債務(wù)償還與財(cái)產(chǎn)分割執(zhí)行協(xié)議
- 2025年度煙酒企業(yè)社會(huì)責(zé)任履行與公益合作合同
- 二零二五年度文化創(chuàng)意產(chǎn)業(yè)銀行擔(dān)保協(xié)議
- 無人機(jī)巡檢方案完整版
- Link 16協(xié)議開發(fā)和關(guān)鍵技術(shù)研究的開題報(bào)告
- 紅色喜慶公司年會(huì)客戶答謝模板
- 鐵未來商業(yè)模擬挑戰(zhàn)賽規(guī)則與流程
- 防止電力生產(chǎn)事故的-二十五項(xiàng)重點(diǎn)要求2023版
- 氯諾昔康針劑在圍術(shù)期鎮(zhèn)痛與其它市場應(yīng)用(代表培訓(xùn)完整版)
- 經(jīng)歷是流經(jīng)裙邊的水
- 《同位角、內(nèi)錯(cuò)角、同旁內(nèi)角》教學(xué)課件2
- 鋰硫電池介紹
- RBA培訓(xùn)教材系列02RBA商業(yè)道德政策培訓(xùn)針對員工
- 高中研究性課題-------食品添加劑
評論
0/150
提交評論