Clasa VII/VIII lecția 10 - 10 dec 2013

From Algopedia
Revision as of 22:51, 23 August 2014 by Cristian (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigationJump to search

Anunţ calificare cerc informatică

Elevii în probe au trimis teme astfel:

Nume Problema 1 Problema 2 Problema 3 Problema 4
Bonciocat Ciprian decodare pom avioane capitala
Cioltan Alex avioane(30)
Coman Mara decodare pom
Enache Adelina decodare pom capitala(C++)
Ionescu Victor
Moanță Victor avioane(30)
Moroianu Theodor capitala(incercat)
Niculescu Tudor pom
Vasilescu Andreea decodare (cu probleme)
Vecerdea Dragoș decodare (cu probleme) avioane
Zaharia Andreea

Elevi care ramîn la cerc:

  • Bonciocat Ciprian
  • Coman Mara
  • Enache Adelina (cu condiţia să înceteze cu C++)
  • Vecerdea Dragoș

Pe lîngă cei care nu erau în probe:

  • Hărșan Răzvan
  • Mucenic Bogdan
  • Petrescu Alex
  • Zloteanu Anastasia

Tema - rezolvări

Rezolvări aici[1]

Lecţie

Problema regine

Mică discuţie despre backtracking şi problema regine. Care sînt diferenţele între recursivitate şi backtracking.

Discuţii probleme Şumen

Rezolvări aici [2]

Permutări, cicluri

O permutare poate fi văzută ca o funcție de rearanjare a valorilor inițiale. Dacă urmărim felul în care valorile își schimbă locurile vom observa că orice permutare conține cicluri, adică submulțimi ale mulțimii de valori care își schimbă circular valorile între ele. Ciclurile sînt disjuncte. Exemplu: fie permutarea (2 5 4 3 1). Pornim cu poziția 1, unde p[1] este 2. Avansăm pe poziția 2, unde p[2] este 5. Avansăm pe poziția 5, unde p[5] = 1, revenind astfel pe poziția 1. Am detectat astfel primul ciclu al permutării, format din (2, 5, 1). Continuăm cu primul element care nu face parte din ciclul găsit, care se află pe poziția 3. p[3] este 4, avansăm pe poziția 4. p[4] este 3, care încheie ciclul. Astfel, permutarea noastră se descompune în două cicluri disjuncte, (2, 5, 1) și (4, 3). Cum putem folosi această proprietate? Iată două exemple:

Exemplul 1: să se spună dacă un vector de n elemente conține toate numerele de la 1 la n. Memoria suplimentară disponibilă este O(1). Avem voie să modificăm vectorul original. O soluție bazată pe ciclurile permutărilor este să parcurgem aceste cicluri și să facem elementele 0 pe măsură ce le parcurgem. Dacă vectorul conține o permutare a numerelor 1-n atunci fiecare ciclu trebuie să se încheie acolo unde a început. Dacă parcurgînd ciclurile vectorului ajungem pe o poziție marcată cu 0 dar diferită de începutul ciclului înseamnă că nu avem o permutare. Ciclurile le parcurgem astfel: pornim cu primul element și parcurgem elementele pînă ne întoarcem. Apoi căutăm primul element diferit de 0 și reluăm. Ne oprim fie cînd găsim un ciclu incorect (caz în care nu avem o permutare), fie cînd ieșim din vector (caz în care permutarea este corectă).

Exemplul 2: a aplica o permutare unor obiecte înseamnă a le schimba ordinea conform permutării. De exemplu, dacă permutarea este (2 5 4 3 1) și o aplicăm obiectelor (1 2 3 4 5), după prima aplicare obținem chiar permutarea, (2 5 4 3 1). După a doua aplicare obținem (5 1 3 4 2), după a treia (1 2 4 3 5) și așa mai departe. Dată o permutare, după cîte aplicări obținem din nou permutarea inițială? Observăm că la fiecare aplicare a permutării ciclurile se rotesc cu 1. Fiecare ciclu i va reveni la poziția inițială după un număr li, care este lungimea ciclului. De aceea va fi nevoie de cmmmc(li) pentru ca toate ciclurile să ajungă în poziția inițială.

Temă

  • Leduri 1 dată la ONI 2007 clasa a 7a
  • Sport dată la ONI 2011 clasa a 8a
  • Lăcusta dată la OJI 2005 clasa a 10a

Rezolvări aici [3]