Clasa a V-a lecția 29 - 18 mar 2014
Comentarii rezolvări temă
- Cei ce nu își fac temele vor fi rugați să nu mai vină la cerc: Josephs, Mușat, Ungureanu. Este ultimul avertisment.
- Unii dintre voi nu dau atenție celor discutate la oră și apoi implementează tema cum îi taie capul. Exemplu: problema siruri1, unde toți cei de la cercul unu ați implementat o soluție cu două for-uri. Unii dintre voi ați implementat o sortare! Soluția prezentată la cerc este mai bună, iar intenția era să o înțelegeți și să o implementați, tocmai pentru a învăța lucruri noi.
- Dacă nu luați 100p pe o problemă la temă nu o lăsați așa: implementați-o la arhivă de 100p.
- Nu uitați else pentru cazurile distincte ale unei condiții. În loc de:
if(catec>max){
max=catec;
min=1000000000;
}
if(catec==max)
if(into<min){
min=into;
pit=i+1;
}
vom scrie:
if(catec>max){
max=catec;
min=into;
pit=i+1;
} else if(catec==max)
if(into<min){
min=into;
pit=i+1;
}
Tema - rezolvări
Rezolvări aici [1]
Lecție
Test blitz: scrieți pe hîrtie o bucată de program C care rezolvă următoarea problemă: se dă un număr natural n, să se spună dacă el este format din strict două cifre repetate de oricîte ori (cel puțin o dată fiecare). Exemple de astfel de numere sînt 323233223, 20000, 101, iar exemple de numere care nu sînt de acest tip sînt 0, 103, 24240. Aveți zece minute.
Am discutat despre ultimul punct de la problema de la temă, cub1. Am remarcat că există o rezolvare directă, în care folosim numai algoritmi de bază cunoscuți: parcurgem fiecare element al vectorului și, pentru fiecare element, îl eliminăm folosind algoritmul de ștergere dintr-un vector, apoi calculăm lungimea celei mai lungi secvențe de culori identice, apoi inserăm înapoi elementul șters. Vom depune valorile calculate într-un vector. La final afișăm numai valorile maximale.
Am menționat că soluție mai elegantă nu șterge și apoi inserează elementul, ci doar parcurge vectorul pretinzînd că acel element nu există. Acest lucru trebuie făcut cu grijă, deoarece putem ușor greși. Am menționat o variantă, și anume să folosim doi indici, i1 și i2, care diferă tot timpul doar cu o unitate, cu excepția cazului cînd i2 "sare" peste i, elementul curent. La fiecare pas i1 va deveni i2, iar i2 va avansa cu unu. În caz că i2 devine egal cu i, îi mai adunăm o dată unu.
În legătură cu cealaltă problemă de la temă, problema îngerași: deși rezolvarea ei este scurtă, înțelegerea ei nu este ușoară. Puteți demonstra că soluția voastră funcționează?
Temă
Deoarece ONI bate la ușă am adus modificări formatului temei: testele *nu* vor mai fi disponibile, iar sursele trimise vor fi penalizate, mai puțin prima, astfel: prima sursă primește zero penalizare, a doua sursă trimisă primește 5 puncte penalizare, a treia sursă primește 10, și așa mai departe.
Vă rog foarte mult să nu trișați. Mă voi uita cu atenție pe campion! Nu trimiteți surse acolo după începerea temei. Vreau să am o evaluare a voastră mai apropiată de regimul de concurs, nu încercați să luați 100p cu orice preț. Punctele la aceste teme nu contează pentru calificarea la cerc, ci doar îmi dau o impresie despre nivelul vostru, pentru a ști pe ce trebuie să pun accentul și cît de mult.
Rezolvări aici [2]