You are on page 1of 7

L P TRNH = ++THU T TON S 4, 15 - 2 - 2012

HANOI
Nguy n H u i n http://nhdien.wordpress.com Email:huudien@vnu.edu.vn Mobile: 0989 061 951

ALGORITHM PROGRAMMING

Gi i thi u
B n th nghi m cho cc b n yu thch l p trnh ph thng v thi Olympic tin h c. Ti c nh l p t p ch i n t v i tn nh trn (l p trang web ring), n i dung cc bi gi ng l p trnh v cc bi thi hay. M i cc b n tham gia v cho ki n. Nh ng bi t p sau y c l y t ti li u su t m trn m ng c bin t p v s a i l i v i n i dung p d ng cc phng php gi i c a tin h c. Cc b n c cc bi hay, su t m hay g i cho ti ti a vo danh sch v i tn ch thch c a b n ho c b n su t m. C g ng c 15 ngy ti ra m t b n lu tr . M i th c m c v yu c u lin h v i: Nguy n H u i n Hanoi University of Science Center for High-Performance Computing 334 Nguyen Trai, Thanh Xuan, Hanoi Office (84-4) 557 2869

Danh sch bi k ny
Bi 4.1 Bi 4.2 Bi 4.3 Bi 4.4 Bi 4.5 T ng o n . . . . . . . o n n i u di nh Dy Farey . . . . . . . Thi p m i . . . . . . . Ly th a 2, 3 v 5 . .
. . . t . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 2 3 5 6

Danh sch chng trnh


1 2 3 4 5 tongdoan.pas . . . . . . . . . . dondieu.pas . . . . . . . . . . . dayfarey.pas . . . . . . . . . . . function . . . . . . . . . . . . . Ly th a c a 2,3,5-luythua.pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 4 6 7

Bi 4.1 (T ng o n) M t dy con g m cc ph n t lin


ti p nhau trong m t dy cho tr c c g i l o n. Cho dy g m N s t nhin. Tm o n ng n nh t c t ng cc ph n t b ng gi tr K cho tr c. nh d ng t p vo: T p vn b n tongdoan.inp Dng th nh t: hai s t nhin N v K, 1 N 2000. T dng th hai tr i: cc ph n t c a dy. nh d ng t p ra: T p vn b n tongdoan.out Ch a m t dng duy nh t g m hai s t nhin d ch s u o n v L s ph n t trong o n (chi u di o n). N u v nghi m th ghi 0 0. Trong cc t p, d li u trn cng dng cch nhau qua d u cch. V d . 21 0 1 20 11 5

tongdoan.inp 17 2 3 2 10 5 5 6 12 30 14 8 0 0 6 0 0

tongdoan.out 16 3

L i gi i 4.1. Ta gi i b ng k thu t c a s tr t nh sau. Xt o n a[i..j] v i t ng S = a[i ] + a[i + 1] + . . . + a[ j], i j. o n ny c


g i l c a s . Ta cho c a s ny tr t d n qua ph i v xt ba tnh hu ng sau y. 1) (S = K ): ta ghi nh n i m u i v di o n lj i + 1. N u di ny nh hn di LMin th ta c p nh t l i cc gi tr iMin v Lmin (th t c Update). R i ti p t c xt c a s m i l a[i + 1..j]. 2) (S < K ): Ta d ch u ph i c a c a s t j sang j + 1, gi nguyn u tri (th t c Right).

L P TRNH = ++THU T TON


S 4, 15 - 2 - 2012 3) (S > K ): Ta co u tri c a c a s t i thnh i + 1 (th t c Left). Ta t ph n t a[n + 1] = 0 lm lnh canh.
1 2 3 4 5 6 7 8 9 10 11 12 14 15 16 17 18 19 20 21 22 23 24 25 26 28 29 30 31 33 34 35 36 37 38 39 40 42 43 44 45 46 47 48 49 50 51 52 54 55 56 57 58 59 60 61 62

sum := sum + a[iRight]; end; procedure Update; begin if (LMin > iRight iLeft + 1) then begin iMin := iLeft ; LMin := iRight iLeft + 1; end; Left ; end; procedure XuLi; begin iLeft := 1; iRight := iLeft ; LMin := n + 1; sum := a[1]; repeat if (sum = k) then Update else if (sum < k) then Right else { sum > k } Left; until ( iRight > n); if (LMin = n+1) then LMin := 0; end; procedure Ghi; begin assign(g,gn); rewrite(g); writeln(g,iMin, bl ,LMin); close(g); end; BEGIN Doc; XuLi; ghi ; END.

Chng trnh 1: tongdoan.pas program tongdoan; uses crt ; const mn = 2001; bl = #32; fn = tdoan.inp ; gn = tdoan.out ; type mw1 = array[0..mn] of word; var f ,g: text; n,k: word; a: mw1; iMin, LMin: word; iLeft , iRight : word; sum: word; procedure Doc; var i : word; begin assign(f, fn) ; reset( f ) ; readln(f ,n, k); for i := 1 to n do read(f,a[ i ]) ; close(f ) ; end; procedure Left; begin sum := sum a[iLeft]; iLeft := iLeft + 1; if ( iLeft > iRight) then begin iRight := iLeft ; sum := a[ iLeft ]; end; end; procedure Right; begin iRight := iRight + 1;

Bi 4.2 (o n n i u di nh t) Cho dy g m N
s nguyn. Tm o n n i u (khng gi m ho c khng tng) c chi u di l n nh t. nh d ng t p vo: T p vn b n dondieu.inp . Dng th nh t: s t nhin N, 1 N 20000. T dng th hai tr i: cc ph n t c a dy. nh d ng t p ra: T p vn b n dondieu.out. Ch a m t dng duy nh t g m hai s t nhin d ch s u o n v L s ph n t trong o n (chi u di o n). Trong cc t p, d li u trn cng dng cch nhau qua d u cch. V d .

.inp 12 1 5 5 1 3 3 3 5 7 9 1 2

.out 4 7

L i gi i 4.2. Nh n xt: o n c 1 ph n t l o n
n i u (tng, gi m), o n g m m t dy lin ti p cc ph n t nhau l o n n i u (tng, gi m). b ng

Ta dng hai bi n m cc ph n t tng ho c b ng nhau lin ti p, dt v m cc ph n t gi m ho c b ng nhau lin ti p, dg. N u ai = ai1 ta tng ng th i dt v dg1 n v . N u ai > ai1 ta tng dt thm 1 n v v t l i dg = 1. N u ai < ai1 ta tng dg thm 1 n 2/7 http://nhdien.wordpress.com

Nguy n H u i n

L P TRNH = ++THU T TON


S 4, 15 - 2 - 2012 v v ch nh l i dt = 1. Sau m i b c ta c p nh t o n n i u di nh t tm c. Chng trnh Pascal c v x l tr c ti p file input. ph c t p: c N. Cc bi n t ng th : n: s l ng ph n t , dt: m s ph n t trong dy tng, dg: m s ph n t trong dy gi m. iMax: ch s u c a o n n i u di nh t, MaxLen: chi u di (s ph n t ) c a o n n i u di nh t.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48

Chng trnh 2: dondieu.pas program DonDieu; uses crt ; const bl = #32; fn = dondieu.inp ; gn = dondieu.out ; var f ,g: text; n: integer; dt,dg: integer; iMax, MaxLen: integer; function Max(a,b,c: integer) : integer; begin if (a < b) then a := b; { a = Max(a,b) } if (a > c) then Max := a else Max := c; end; procedure XuLi; var i ,m,x,y: integer;

begin assign(f, fn) ; reset( f ) ; readln(f ,n); read(f ,x) ; dt := 1; dg := 1; MaxLen := 1; iMax := 1; for i := 2 to n do begin read(f ,y) ; if (y = x) then begin dt := dt + 1; dg := dg + 1; end else if (y > x) then begin dt := dt + 1; dg := 1; end else { y < x } begin dg := dg + 1; dt := 1; end; m := Max(MaxLen, dt, dg); if (m > MaxLen) then begin MaxLen := m; iMax := i MaxLen + 1; end; x := y; end; close(f ) ; end; procedure Ghi; begin assign(g,gn); rewrite(g); writeln(g, iMax, bl , MaxLen); close(g); end; BEGIN XuLi; Ghi; END.

Bi 4.3 (Dy Farey) Cho s t nhin N > 0. hy li t


k theo tr t t tng d n cc phn s t/m th a ng th i cc tnh ch t sau: - t/m l phn s t i gi n bi n thin trong kho ng 0..1, - m bi n thin trong kho ng 1..N. nh d ng t p vo: T p vn b n FAREY.INPch a s N. nh d ng t p ra: T p Dng th nh t: D s l ng cc phn s trong dy. T dng th hai: m i dng hai s t nhin tm ghi cch nhau qua d u cch, th hi n m t phn s trong dy s p tng. V d . 5

farey.inp 11 0 1 1 5 1 4 1 3 2 5 1 2 3 5 2 3 3 4 4 5 1 1

farey.out

L i gi i 4.3. N u sinh l n l t cc phn s r i s p


x p th kh t n b nh v t i a ph i dnh b nh lu tr n2 phn s . Nguy n H u i n 3/7 http://nhdien.wordpress.com

L P TRNH = ++THU T TON


S 4, 15 - 2 - 2012 Phng n 1. N u t/m v a/b l hai phn s s lin ti p trong dy Farey th a/b = min{ x/y| x/y > t/m, y = 1..n, x y, ( x, y) = 1} trong ( x, y) l c chung l n nh t c a x v y. Cc phn s x/y trong t p trn c g i l cc ng vin. Ta s c cng t ng vin cng t t. V i y = 1, do x y nn ta c ngay phn s 1/1 l ph n t l n nh t trong dy. V i m i y = 2..n ta xt phn s x/y l phn s u tin l n hn t/m. Ta c t t/m < x/y ta suy ra mx > ty nn x > (tydivm). N u bi t m ta ch n x = (tydivm) + 1 s thu c phn s x/y th a ng th i cc tnh ch t sau: -1mn - x/y l phn s u tin l n hn t/m. c t trn c thu g n l i v i n 1 ng vin nh sau, a/b = min{ x/y|y = 2..n, x = (tydivm) + 1} Nh v y, n u sinh c phn s t/m cho dy Farey th phn s ti p theo a/b s c ch n l phn s nh nh t trong t p n 1 phn s ni trn. r ng 0/1 l phn s u tin v 1/1 l phn s cu i cng c a dy Farey. Th t c Next(n, t, m) trong phng n 1 s xc nh phn s a/b st sau phn s t/m trong dy Farey. Gi tr tm c s t ngay trong t/m. ph c t p. Xu t pht t phn s u tin 0/1, m i l n ta ph i sinh ra n 1 ng vin t ch n ra 1 phn s trong dy. N u dy c s phn s th ta ph i th c hi n s(n 1) php ton trn cc phn s . Gi tr max c a s l n2 . V y ph c t p tnh ton vo c n3 . Phng n 2. Ta c th sinh d n cc ph n t cho dy Farey nh sau. Cho hai phn s a/b v c/d, phn s ( a + c)/(b + d) c g i l phn s trung bnh c a hai phn s ny. Nh n xt. N u t1 /m1 , t2 /m2 , t3 /m3 l ba phn s lin ti p trong dy Farey th phn s gi a l phn s trung bnh c a hai phn s kia. Ta c thu t ton sau: Nguy n H u i n 4/7 Xu t pht v i m u s m = 1 ta c dy 2 phn s : 0/1, 1/1. V i m i m u s m = 2..n ta sinh cc phn s trung bnh c m u s m c a hai phn s k nhau trong dy tr c v xen phn s ny vo gi a hai phn s sinh ra n d n vo trong dy k t qu . m = 2: thm cc phn s trung bnh v i m u b ng 2: 0/1, 1/2, 1/1. m = 3: thm cc phn s trung bnh v i m u b ng 3: 0/1, 1/3, 1/2, 2/3, 1/1. ... Cc phn s m i sinh trong m i l n duy t c g ch d i. Ta dng hai m ng: a lu cc phn s c a dy tr c, b lu cc phn s c a dy sau. Sau m i b c l p ta chuy n b qua a. D li u c m t nh sau:
1 2 3 4 5

const mn = 1000; type PS = record tu,mau: byte end; mps = array[0..mn] of PS; { m ng cc PS } var a,b: mps;

ph c t p. Th i gian: n3 , mi n nh : 2 m ng kch th c n2 . Phng n 3. Ta s d ng m t s tnh ch t c a dy Farey ti p t c c i ti n thu t ton. N u t1 /m1 , t2 /m2 , t3 /m3 l ba PS lin ti p trong dy Farey th 1. t2 m1 t1 m2 = 1, 2. m1 + m2 > n, 3. t2 /m2 = (t1 + t3 )/(m1 + m3 ), 4. t3 = vt2 t1 , m3 = vm2 m1 viv = (m1 + n)divm2 . T tnh ch t 4 ta suy ra ngay cch xc nh PS t3 /m3 thng qua hai PS st tr c. Cc trnh d i y minh h a 3 phng n v i cc k t qu hi n th trn mn hnh b n c c th theo di. Chng trnh 3: dayfarey.pas
1 2 3 4 5 6

( Ba phuong an cho bai Day Farey ) program dayfarey; uses crt ; const bl = #32; nl = #13#10; http://nhdien.wordpress.com

L P TRNH = ++THU T TON


S 4, 15 - 2 - 2012
7 8 9 10 11 12 13 14 15 16 17 19 20 21 22 23 24 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 46 47 48 49 50 51 52 53 54 55 56 57

var n: integer; { Uoc chung lon nhat cua hai so tu nhien a, b } function Ucln(a,b:integer) :integer; var r : integer; begin while b > 0 do begin r := a mod b; a := b; b:=r end; Ucln:=a; end; { Rut gon PS a/b thanh PS t/m } procedure RutGon(a,b:integer; var t,m:integer); var d:integer; begin d :=Ucln(a,b); t := a div d; m := b div d; end; { Tim PS sat sau PS t/m, ket qua dat trong t/m } function Next(n:integer;var t ,m:integer):Boolean; var a,b,x,y: integer; begin if (t+m=2) then begin Next := false ; exit end; a := 1; b := 1; for y := 2 to n do begin x := ty div m + 1; if ay > bx then begin a := x; b:=y end; end; RutGon(a,b,t,m); Next := true; end; procedure Farey1(n: integer); var t ,m,d:integer; begin writeln( nl , Farey1) ; d := 0; t := 0; m := 1; repeat write(t , / ,m,bl) ; inc (d); until not Next(n,t ,m); writeln( nl , Total : ,d, PS); readln; end; procedure Farey2(n: byte);

58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106

const mn = 1000; type PS = record tu,mau: byte end; mps1 = array[0..mn] of PS; var a,b: mps1; { 2 day PS a , b } d,k, i ,m:integer; begin writeln( nl , Farey2) ; d := 2; a [1]. tu := 0; a [1]. mau := 1; { PS dau day } a [2]. tu := 1; a [2]. mau := 1; { PS thu hai } for m:=2 to n do begin k := 0; inc (k); b[k] := a[k ]; for i := 2 to d do begin if a[ i ]. mau+a[i1].mau = m then begin inc (k); b[k ]. tu := a[ i 1].tu + a[i ]. tu; b[k ]. mau := a[i1].mau + a[i].mau; end; inc (k); b[k] := a[ i ]; end; a := b; d := k; end; for i := 1 to d do write(a[ i ]. tu, / ,a[ i ]. mau,bl); writeln( nl , Total ,d, PS); readln; end; procedure Farey3(n: integer); var t1 ,m1,t2,m2,t3,m3,v,d: integer; begin writeln( nl , Farey3) ; d := 2; t1 := 0; m1 := 1; { PS dau day } t2 := 1; m2 := n; { PS thu hai } write(t1 , / ,m1,bl,t2 , / ,m2,bl); while (t2 + m2 <> 2) do begin v := (m1+n) div m2; t3 := vt2 t1; m3 := vm2 m1; write(t3 , / ,m3,bl); inc (d); t1 := t2; t2 := t3; m1 := m2; m2 := m3; end; writeln( nl , Total ,d, PS); readln; end; BEGIN n := 5; Farey1(n); Farey2(n); Farey3(n); END.

Bi 4.4 (Thi p m i)
Nguy n H u i n 5/7 http://nhdien.wordpress.com

L P TRNH = ++THU T TON


S 4, 15 - 2 - 2012 Minh mu n lm m t thi p chc t t Qu Mi c n n c t o b i 2n dng, m i dng l m t dy k t g m n ch ci Q v M sao cho hai dng k nhau khc nhau t i ng m t v tr, dng cu i cng cng c coi l k v i dng u tin. Gi s b n c th gip Minh lm i u . V i m i gi tr n v k cho tr c b n hy hi n th dng th k trong t m thi p trn. Cc dng c m s t 1 tr i, 1 n 30. tin c a T (n 1) gi ng nhau nn khi thm Q cho dng trn v M cho dng d i chng s khc nhau t i v tr thm . Tng t , dng u tin c a T (n 1) v dng cu i cng c a T*(n-1) gi ng nhau nn khi thm Q cho dng u v M cho dng cu i chng s khc nhau t i v tr thm. D a theo thu t ton trn ta vi t hm Line(n, k ) sinh ra dng th k trn t m thi p T (n). Th d , Line(3, 7) = MQM. Hm s l p n l n, m i l n sinh 1 k t theo chi u ng c l i v i ki n thi t trn. Ta th y, n u k > 2n 1 th ch ng t dng k n m trong T (n 1), do k t u dng c a n s ph i l M v dng t T (n 1) l t xu ng dng k s c ch s 2n k + 1, ng c l i, n u k 2n 1 th dng k n m trong T (n 1), do k t u dng c a n l Q. Chng trnh 4: function
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

L i gi i 4.4. K hi u T (n) l t m thi p c thi t k v i gi tr n cho tr c. T (n) d ng y s ch a 2n dng. T (1) ch a hai dng l Q v M. Gi s ta thi t k xong T (n 1), khi T (n) s c thi t k
theo 3 b c sau. B c 1. L t: L t T (n 1) xu ng pha d i, t c l l y i x ng qua ng k ngang cu i t m thi p. Ta k hi u ph n i x ng c a T (n 1) l T (n 1). B c 2. Thm Q: Vi t thm k t Q vo m i dy c a T ( n 1). B c 3. Thm M: Vi t thm k t M vo m i dy c a T ( n 1). Ta c th vi t thm k t vo u ho c cu i dy. Trong bi ny ta ch n u dy. D dng ch ng minh r ng thu t ton trn sinh ra cc t m thi p th a cc yu c u c a u bi. Th t v y, ta g i P l tnh ch t "Hai dng k nhau khc nhau t i ng m t v tr". Khi T (1) th a P l hi n nhin v n ch ch a 2 dng Q v M. Gi s T (n 1) th a P. Khi ng nhin T (n 1) cng th a P. Do php i x ng, dng cu i cng c a T (n 1)v dng u

function Line(n: integer; k: longint ) : string ; var s : string ; m: longint ; i : integer; begin m := 1; m := m shl n; { m = 2^n } for i := n downto 1 do begin m := m shr 1; { m div 2 } if (k <= m) then s := s + Q else begin s := s + M; k := 2m k + 1; end; end; Line := s ; end;

Bi 4.5 (Ly th a 2, 3 v 5) V i m i gi tr N cho


tr c hy sinh N s u tin theo tr t t tng d n l tch cc ly th a c a 2, 3 v 5. nh d ng t p vo: T p vn b n luythua.inp . Ch a s t nhin N, 1 N 1000. nh d ng t p ra: T p vn b n luythua.out .. N s tm c, m i dng m t s . V d . 12

luythua.inp 1 2 3 4 5 6 8 9 10 12 15 16

luythua.out

L i gi i 4.5. G i S l t p cc s c n tm. Ta c
Nguy n H u i n 6/7 http://nhdien.wordpress.com

L P TRNH = ++THU T TON


S 4, 15 - 2 - 2012 (i) 1 S (ii) N u x S th 2x, 3x, 5x S. Gi s cc ph n t trong S c s p tng v ta tm c ph n t th i. Ta k hi u S(i ) = { a1 , a2 , . . . , ai }. tm ph n t th i + 1 ta nh n xt ai+1 = min 2x, 3y, 5z| x, y, z S(i ), 2x > ai , 3y > ai , 5z > ai Ta s d ng 3 bi n i2, i3, i5 ghi nh n cc ch s trong S sao cho ai2 = x, ai3 = y v ai5 = z. Cc bi n a[1], i2, i3 v i5 c kh i tr 1. Khi hm Next(i ) sinh ph n t st sau ph n t A[i ] s nh sau:
1 2 3 4 5 6 7 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

function Next(i : integer) : integer; begin while (a[ i2 ] 2 <= a[i]) do i2 := i2 + 1; while (a[ i3 ] 3 <= a[i]) do i3 := i3 + 1; while (a[ i5 ] 5 <= a[i]) do i5 := i5 + 1; Next := Min(a[i2 ]2, a[ i3 ]3, a[ i5 ]5) ; end; Chng trnh 5: Ly th a c a 2,3,5-luythua.pas

uses crt ; const bl = #32; mn = 1001; fn = luythua. inp ; gn = luythua.out ; type ml1 = array[0..mn] of longint ; var f ,g: text; n: integer; a: ml1; procedure Doc: {t vi t; } function Min(a,b,c: longint ) :{ t vi t ; } function Next(i : integer) : {t vi t ; } procedure Sinh; var i : longint ; begin assign(g,gn); rewrite(g); a [1] := 1; writeln(g,1) ; i2 := 1; i3 := 1; i5 := 1; for i := 2 to n do begin a[ i ] := Next(i 1); writeln(g,a[ i ]) ; end; close(g); end; BEGIN Doc; Sinh; END.

program luythua;

Nguy n H u i n

7/7

http://nhdien.wordpress.com

You might also like