Implementri sugerate Probleme propuse Soluiile problemelor Capitolul 8
8.1. Principiul cutiei lui Dirichlet Cunoscutul matematician Peter Gustav Lejeune Dirichlet a enunat n cartea sa Recherches sur les formes quadratiques coefficients et indtermines complexes urmtorul principiu:
Se consider n obiecte care trebuie dispuse n k cutii, cu n > k. Atunci exist o cutie care va conine cel puin dou obiecte.
Forma generalizat a principiului:
Se consider p obiecte care trebuie plasate n c cutii i un numr natural n care veri- fic proprietatea: p > n c. Atunci, indiferent de dispunerea obiectelor, va exista o cu- tie care va conine cel puin n + 1 obiecte.
Plecnd de la acest principiu se pot rezolva uor o serie de probleme.
Exemplul 1 ntr-o mare bibliotec, exist ntotdeauna dou cri care conin acelai numr de cuvinte (Abraham, 1933).
Soluie Un rnd al crii poate conine cel mult 20 de cuvinte. O pagin conine cel mult 50 de rnduri. O carte conine cel mult 1000 de pagini. Prin urmare o carte conine cel mult un milion de cuvinte. Deci o bibliotec n care exist cel puin 1.000.001 cri are dou cri cu acelai numr de cuvinte.
222 8. Principiul lui Dirichlet
Exemplul 2 ntr-un magazin de nclminte se afl p perechi de pantofi de msuri diferite. Din pcate pantofii nu sunt mperecheai din neglijena vnztorului care nu i-a pus la loc n cutiile lor dup ce au fost probai de clieni. Vnztorul dorete s gseasc doi pan- tofi care formeaz o pereche. Care este numrul minim de pantofi care trebuie cerce- tai pentru a fi siguri c s-a obinut o pereche?
Soluie Vnztorul va lua pe rnd cte un pantof i l va pune fie n cutia cu perechea lui, fie ntr-o cutie nou, dac perechea lui nc nu s-a pus n cutie. n cazul cel mai defa- vorabil, va lua p pantofi diferii i i va aeza n cutii, iar al p + 1-lea pantof va fi pere- chea unuia deja ales.
Exemplul 3 Dndu-se cinci puncte n interiorul unui triunghi echilateral de latur 1, s se arate c exist dou puncte cu distana dintre ele mai mic de .
Soluie
Ducnd liniile mijlocii n triunghi, vom obine patru triunghiuri echilaterale de la- tur . Conform principiului, exist un triunghi care conine cel puin dou puncte. Aceste puncte verific proprietatea cerut.
Exemplul 4 Se dau n + 1 numere naturale diferite, mai mici ca 2n. S se verifice dac exist printre ele trei numere, astfel nct unul dintre ele s fie egal cu suma celorlalte dou.
Soluie Fie numerele date a 1 < a 2 < ... < a n+1 . Atunci se verific relaia: 0 < a 2 a 1 < a 3 a 1 < < a n+1 a 1 < 2n Aplicm principiul cutiei pentru numerele a 1 , a 2 , ..., a n+1 , a 2 a 1 , ..., a n+1 a 1 , fiecare avnd valoarea n mulimea {1, 2,, 2n 1}, deci cel puin dou numere sunt egale. Dar datorit condiiilor problemei, unul dintre aceste dou numere va aparine mulimii {a 1 , a 2 , ..., a n+1 } i cellalt mulimii {a 2 a 1 , ..., a n+1 a 1 }. Fie aceste numere a p i a q a 1 . Deci a p = a q a 1 i atunci a q = a p + a 1 .
Exemplul 5 Se consider m calculatoare notate cu c 1 , , c m i n imprimante notate cu p 1 , , p n , unde m > n. Se cere s se determine numrul minim de legturi calculator-imprimant, astfel nct dac la un moment dat n calculatoare doresc simultan s scrie la impri- mante, acest lucru s fie posibil (legturile stabilite s permit celor n calculatoare s foloseasc legturi la imprimante diferite). 8. Principiul lui Dirichlet 223
Soluie Pentru a fi ndeplinit condiia cerut trebuie ca la oricare dintre imprimante s se scrie, oricum s-ar alege n calculatoare. Fie p i o imprimant oarecare. Atunci numrul minim de legturi necesare spre imprimanta p i este m n + 1. Astfel rmn doar m (m n +1) = n 1 calculatoare nelegate la p i i atunci oricum am alege n calculatoare, unul va scrie la ea. Cum exist n imprimante, vor fi necesare pentru fiecare imprimant m n + 1 leg- turi i deci n total n(m n + 1) legturi.
8.2. Implementri sugerate Pentru a v familiariza cu aceast clas de probleme, v recomandm s scriei progra- mele aferente exemplelor prezentate.
8.3. Probleme propuse
8.3.1. Camioane Considerm un depozit care are n ncperi, coninnd diferite cantiti de marf notate cu c 1 , c 2 , ..., c n . S se scrie un program care determin un grup de ncperi, avnd proprietatea c suma cantitilor de marf pe care le conin se poate mpri exact la cele n camioane identice care le transport.
Date de intrare Prima linie a fiierului de intrare CAMION.IN conine numrul natural n. Urmtoarea linie conine cele n valori c i , (i = 1, 2, , n) separate prin spaii.
Date de ieire Fiierul de ieire CAMION.OUT va conine numerele de ordine ale camerelor care apar- in soluiei.
Restricii i precizri 1 n 1000; 1 c i 30000, i = 1, 2, , n (c i sunt numere naturale distincte); Dac exist mai multe soluii, n fiier se va scrie una singur.
Exemplu CAMION.IN 7 31 3 6 17 12 1 8 CAMION.OUT 3 4 5 224 8. Principiul lui Dirichlet
8.3.2. Multiplu Se d un numr natural n. S se gseasc un multiplu al lui care s conin doar cifrele 0 i 1. Fiecare cifr va aprea n multiplu cel puin o dat.
Date de intrare Prima linie a fiierului de intrare MULTIPLU.IN conine numrul natural n.
Date de ieire Fiierul de ieire MULTIPLU.OUT va conine multiplul cerut.
Restricii i precizri 1 n 10000.
Exemplu MULTIPLU.IN 7 MULTIPLU.OUT 1111110
8.3.3. Numere Se dau (m 1)(n 1) + 1 numere naturale nenule distincte, memorate n irul x. S se arate c exist cel puin m numere n ir care se divid succesiv unul pe altul sau exist cel puin n care nu se divid ntre ele. S se afieze numerele care verific aceste condi- ii. Se cere reprezentarea grafic a rezolvrii problemei.
Date de intrare Prima linie a fiierului de intrare NUMERE.IN conine numerele naturale m i n, separate printr-un spaiu. Urmtoarea linie conine cele (m 1)(n 1) + 1 numere x i , separate prin cte un spaiu.
Date de ieire Numerele se vor introduce treptat n csuele corespunztoare reprezentrii grafice, conform exemplului. La gsirea soluiei, aceasta se va afia cu o culoare diferit.
Restricii i precizri 1 n, m 100; 0 < x i < 30000, i = 1, 2, , (n 1)(m 1) + 1.
O imagine posibil pentru datele coninute n fiierul de intrare de mai sus ar fi:
9 11 15 18 22 33 36 99 110 180 220
440
8.3.4. Nunta La o nunt se ntlnesc mai multe persoane, numerotate de la 1 la n. S se afieze, dac exist, dou persoane care au acelai numr de rudenii.
Date de intrare Prima linie a fiierului de intrare NUNTA.IN conine un numr natural n, reprezentnd numrul nuntailor. Urmtoarele linii conin perechi de numere ntregi i, j cu i i j ru- denii.
Date de ieire Fiierul de ieire NUNTA.OUT va conine dou numere naturale, reprezentnd dou persoane cu acelai numr de rudenii.
Restricii i precizri 1 n 1000; n fiier se va scrie o singur soluie.
8.3.5. Cifre S se gseasc un multiplu al numrului natural dat n care conine doar cifrele 0 i 5.
Date de intrare Prima linie a fiierului de intrare CIFRE.IN conine numrul natural n.
226 8. Principiul lui Dirichlet
Date de ieire Fiierul de ieire CIFRE.OUT va conine multiplul cerut.
Restricii i precizri 1 n 10000.
Exemplu CIFRE.IN 7 CIFRE.OUT 50505
8.4. Soluiile problemelor propuse
8.4.1. Camioane n enun s-a precizat c avem n ncperi i n camioane. n ncperi avem diferite canti- ti de marf care ar trebui transportate cu cele n camioane. Nu cunoatem capacitatea de transport a camioanelor, n schimb tim c ele sunt identice. n concluzie, vom cu- ta s determinm o sum de cantiti care este multiplu de n (i astfel se poate ncrca fiecare cea de a n-a parte n cte un camion). Astfel problema s-a redus la depistarea acelor ncperi n care suma cantitilor este multiplu de n. Vom considera urmtoarele sume: s 1 = c 1
s 2 = c 1 + c 2
s 3 = c 1 + c 2 + c 3
s n = c 1 + c 2 + c 3 ++ c n
Distingem dou situaii: a) Exist i pentru care s i este multiplu de n. Atunci grupul de ncperi va conine ncperile avnd numerele de ordine: 1, 2,, i. b) Nu exist nici o sum din cele de mai sus care s fie multiplu de n. n acest caz, vom calcula irul de resturi r i = s i mod n, i = 1, 2, ..., n. Cum toate cele n resturi sunt nenule i valorile lor se reduc la cele n 1 elemente ale mulimii {1, 2, , n 1}, aplicnd principul cutiei lui Dirichlet, vor exista dou resturi egale. Fie p i q doi in- dici (p < q) pentru care r p = r q . Atunci diferena dintre sumele s q i s p este multiplu de n, deci soluia problemei o constituie ncperile p + 1, p + 2, , q. Adic tiind c s p = c 1 + c 2 + + c p i s q = c 1 + c 2 + + c p + c p+1 + + c q , calculm diferena s q s p = c 1 + c 2 + + c p + c p+1 + + c q (c 1 + c 2 + + c p ) = c p+1 + + c q .
8. Principiul lui Dirichlet 227
Subalgoritm Determin_ncperi(n,c): pentru i=1,n execut: { calculm irul de resturi a sumelor pariale a cantitilor din cele n camere } rest[i] 0 sfrit pentru r 0 { sumele pariale le generm n r } pentru i=1,n execut: r (r + c[i]) mod n { calculm sumele pariale } dac r = 0 atunci { dac o sum parial se divide cu n } scrie 1,2,...,i { cantitatea din ncperile 1, 2, ..., i este multiplu de n } ieire forat din subalgoritm altfel dac rest[r] 0 atunci numr_ncperi i - rest[r] prima_ncpere rest[r] + 1 pentru j=1,numr_ncperi execut: scrie prima_ncpere + j - 1 sfrit pentru ieire forat din subalgoritm altfel rest[r] i sfrit dac sfrit dac sfrit pentru sfrit subalgoritm
8.4.2. Multiplu Considerm irul numerelor: 1, 11, 111, 1111, 11..1, unde n ultimul numr avem n cifre de 1. Vom calcula resturile mpririi acestor numere la n i le vom memora n irul rest i , i = 1, 2, ..., n. Dac n acest ir exist un element rest k = 0, atunci numrul cerut se for- meaz din k cifre de 1 urmate de o cifr 0. Dac toate elementele irului sunt nenule, ele aparin mulimii {1, 2, , n 1}. Conform principiului cutiei lui Dirichlet, cel puin dou dintre aceste resturi sunt ega- le. Fie p < q i rest p = rest q . Atunci diferena dintre numrul 111 (avnd q cifre) i numrul 111 (avnd p cifre) se mparte exact la n i este deci multiplu de n. Num- rul cerut va avea n acest caz primele q p cifre egale cu 1, iar ultimele p cifre egale cu 0.
228 8. Principiul lui Dirichlet
Subalgoritm Determin_multiplu(n): rest[1] 1 pentru i=2,n execut: rest[i] (rest[i-1] * 10 + 1) mod n dac rest[i] = 0 atunci scrie i buci de 1 i un singur 0 ieire forat din subalgoritm altfel j 1 repet dac rest[j] = rest[i] atunci scrie i-j buci de 1 i j buci de 0 ieire forat din subalgoritm altfel j j + 1 pn cnd j = i sfrit dac sfrit pentru sfrit subalgoritm
8.4.3. Numere Ordonm cresctor irul x, apoi l parcurgem i repartizm numerele ntr-o matrice de dimensiuni (m 1) (n 1) astfel: Scriem un numr pe linia i dac x se divide printr-un numr situat pe linia i 1 i i este maxim avnd aceast proprietate. Repartizm un numr pe o linie n prima poziie liber.
Vom considera c n matrice exist i linia 0 (care conine elementul 1), dar pe aceast linie nu putem repartiza numere.
Exemplu Fie m = 4, n = 4 i numerele: 2, 6, 10, 16, 50, 70, 99, 100, 123, 150. Completm matricea respectnd paii specificai anterior.
2 2 2 2 2 2 2 2 2 99 6 6 10 16 50 70 100 Am ieit din matrice pe coloana 1. 100 are divizorul 50 pe linia 3, 50 are divizo- rul 10 pe linia 2, 10 are divizorul 2 pe linia 1. Am gsit deci numerele 2, 10, 50 i 100 care verific prima proprietate. 8. Principiul lui Dirichlet 229
Datorit modului de construire a matricei, n momentul n care se ncearc aduga- rea unui element x k care are un divizor pe linia m 1, acesta ar trebui repartizat pe coloana 1 a liniei m. Vom putea preciza m numere care se divid reciproc. Unul dintre acestea este x k, de pe linia m. Pe linia precedent (m 1) vom gsi n mod sigur un divizor al lui. l selectm i continum procedeul avansnd cu nc o linie n matrice (m 2). Repetm procedeul pn la linia 1 inclusiv.
Exemplu Fie m = 5, n = 4 i numerele: 2, 6, 10, 12, 16, 18, 38, 56, 80, 90, 101, 300, 245.
2 2 2 2 2 2 2 2 6 6 10
2 11 2 6 10 6 10 16 38 12 12 18
Am ieit din matrice pe linia 2. Din cauz c numerele sunt situate pe aceeai linie, ele nu se divid unele pe altele. Deci n acest caz soluia problemei este: 6, 10, 16, 38. ntotdeauna se vor gsi numerele cu proprietatea cerut pentru c n matrice se pot repartiza doar (n 1)(m 1) numere. Dar trebuie repartizate (n 1)(m 1) + 1. Deci, n cel mai defavorabil caz, ultimul numr repartizat n matrice va completa o soluie.
n vederea afirii grafice, lungimea i limea reelei de ptrate se calculeaz n funcie de rezoluia ecranului, stabilindu-se dimensiunea laturii unui ptrat din aceast reea. Cunoscnd aceast valoare i stabilind coordonatele colului stnga-sus al ree- lei, se deseneaz efectiv reeaua de (n 1)(m 1) ptrate n procedura desen_retea, pentru fiecare ptrat calculndu-se coordonatele colurilor stnga-sus i dreapta-jos.
coloana j linia i latura x ij , y ij
x_sus, y_sus
Coordonatele ptratului de pe linia i i coloana j sunt: 230 8. Principiul lui Dirichlet
x ij = x_sus+latura*(j-1) y ij = y_sus+latura*(i-1)
n paralel cu rezolvarea propriu-zis a problemei se realizeaz desenarea numerelor n ptratele corespunztoare. Cnd se completeaz un element a[i,j] al matricei, se afieaz pe ecran numrul respectiv. La umplerea unei linii sau coloane, se scriu din nou pe ecran numerele care fac parte din soluie, dar colorate diferit.
procedure repartizeaza_deseneaza; var i,l,j,t,y:Integer; max,xmax,ymax,ErrCode,gd,gm:Integer; begin gd:=Detect; { initializare mod grafic } InitGraph(gd,gm,'C:\bp\bgi'); desen_retea; for t:=1 to nr do begin l:=cauta_linie(x[t]); if l=m then begin { s-a iesit din matrice pe coloana 1 } y:=x[t]; pune_numar(m,1,x[t]); Delay(timp); SetColor(Red); { reafiseaza numerele solutiei cu alta culoare } pune_numar(m,1,x[t]); while l>1 do begin Dec(l); for j:=1 to a[l,0] do if y mod a[l,j]=0 then begin pune_numar(l,j,a[l,j]); y:=a[l,j]; Break end; Delay(timp) end; ReadKey; CloseGraph; Exit end else { s-a iesit din matrice pe o linie } if a[l,0]=n-1 then begin pune_numar(l,n,x[t]); Delay(1000); { reafiseaza numerele din solutie cu alta culoare } SetColor(Red);
8. Principiul lui Dirichlet 231
for i:=1 to n-1 do pune_numar(l,i,a[l,i]); pune_numar(l,n,x[t]); ReadKey; CloseGraph; Exit end else begin { se repartizeaza elementul in matrice } Inc(a[l,0]); a[l,a[l,0]]:=x[t]; pune_numar(l,a[l,0],x[t]); Delay(timp); if a[l,0]=1 then ultima_linie:=l end end end;
8.4.4. Nunta Fie gr 1 , gr 2 ,gr n cu gr i reprezentnd numrul de rudenii ale persoanei i. Cum exist n persoane, vom avea 0 gr i n 1, i = 1,n. Distingem dou situaii: a) dac exist o cel puin o persoan care are n 1 rudenii (toat lumea) rezult c toate persoanele au cel puin o rudenie. Atunci cele n valori din ir sunt numere din mulimea {1, , n 1}. Conform principiului cutiei, cel puin dou valori sunt egale. b) dac nu exist nici o persoan cu n 1 rudenii, cele n valori ale irului sunt cuprin- se n mulimea {0, 1, 2, , n 2} care are n 1 valori distincte. i n acest caz, conform principiului cutiei, exist dou valori care sunt egale. n termenii din teoria grafurilor, considernd persoanele nodurile unui graf neorien- tat, iar relaiile de rudenie muchiile acestuia, problema se poate enuna astfel: n orice graf neorientat exist dou noduri care au acelai grad. Presupunnd c s-au determinat elementele irului gr, algoritmul de determinare a soluiei este:
Subalgoritmul Determin_pereche(n,gr,p,q): pentru i=1,n execut: x[i] 0 sfrit pentru pentru i=1,n execut: dac x[gr[i]] 0 atunci p i { mai exist o persoan cu acelai numr de rudenii } q x[gr[i]] scrie p,q ieire forat din pentru 232 8. Principiul lui Dirichlet
altfel x[gr[i]] i sfrit dac sfrit pentru sfrit subalgoritm
8.4.5. Cifre Considerm irul numerelor 50, 5050, 505050, , 5050..50. (n perechi de '50' alipite) Vom calcula resturile mpririi acestor numere la n i le vom memora n irul rest i , i = 1, 2, ..., n. Dac n acest ir exist un element rest k = 0, atunci numrul care d acest rest prin mprirea la n este numrul cerut n problem. Dac toate elementele irului sunt nenule, ele aparin mulimii {1, 2, , n 1}. Conform principiului cutiei lui Dirichlet, cel puin dou dintre ele sunt egale. Fie j < i cu rest i = rest j . Atunci diferena dintre numerele care prin mprirea la n au dat cele dou resturi egale va constitui numrul cerut. Acesta va fi de forma: 505050000000..00 (i j perechi '50' urmate de j perechi '00').
Subalgoritm Determin_multiplu(n): rest[1] 50 mod n pentru i=2,n execut: rest[i] (rest[i-1] * 100 + 50) mod n dac rest[i] = 0 atunci scrie i perechi de '50' ieire forat din program altfel j 1 repet dac rest[j] = rest[i] atunci scrie i-j perechi de '50' urmate de j perechi '00' ieire forat din program altfel j j + 1 sfrit dac pn cnd j = i sfrit dac sfrit pentru sfrit subalgoritm