Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sd-ca:teme:tema1 [2019/02/24 15:46]
george.popescu0309
sd-ca:teme:tema1 [2019/04/06 19:22] (current)
george.popescu0309
Line 1: Line 1:
-<​hidden>​ 
 ====Tema1==== ====Tema1====
  
Line 5: Line 4:
   * [[mailto:​andistroie@gmail.com | Alexandru Mihai Stroie]]   * [[mailto:​andistroie@gmail.com | Alexandru Mihai Stroie]]
   * [[mailto:​george.apopescu97@gmail.com | George Popescu]]   * [[mailto:​george.apopescu97@gmail.com | George Popescu]]
-  *   Data publicării: ​14 martie 2018 +  *   Data publicării: ​11.03.2019 
-  *   ​Deadline: ​5 aprilie 2018 ora 02:55+  *   ​Deadline: ​**05.04.2019 ​ora 23:55** 
 + 
 +=== Modificări și actualizări === 
 +  * **18 martie** 
 +       * modificare nume fisiere intrare/​iesire in races.in/​races.out 
 +       * update checker 
 + 
 +<note warning>​**Atenite!** O tema care nu compileaza va primi 0 puncte.</​note> ​
  
 === Obiective === === Obiective ===
  
   * Aprofundarea cunoștințelor în utilizarea limbajului C++   * Aprofundarea cunoștințelor în utilizarea limbajului C++
-  * Implementarea și utilizarea structurilor de date listă, skiplist.+  * Implementarea și utilizarea structurilor de date listă, skiplist ​(generice).
  
-<note warning>​Orice tema ce nu va folosi skipList va primi maxim 60% din nota.</​note>​+<note warning>​Orice tema ce nu va folosi skipList va primi maxim 5/8 puncte pe test (maxim ​nota 7/10 pe tema). </​note>​
  
  
Line 21: Line 27:
   ​   ​
 === Desfasurarea campionatului === === Desfasurarea campionatului ===
- +
 In campionat vor fi m curse. Datele despre o cursa vor fi date ca un sir de n numere: t_1, t_2, …, t_n, unde t_i este timpul pe care l-a avut concurentul cu id-ul i in acea cursa. \\ In campionat vor fi m curse. Datele despre o cursa vor fi date ca un sir de n numere: t_1, t_2, …, t_n, unde t_i este timpul pe care l-a avut concurentul cu id-ul i in acea cursa. \\
 Daca un concurent are t_i egal cu 0, asta inseamna ca el nu a participat la acea cursa (nici nu pierde, dar nici nu primeste puncte).\\ Daca un concurent are t_i egal cu 0, asta inseamna ca el nu a participat la acea cursa (nici nu pierde, dar nici nu primeste puncte).\\
 Fie P numarul de participanti ai unei curse. Acestia vor primi punctaje din intervalul [P/2, -P/2] in functie de pozitia pe care au ocupat-o in clasament astfel: primul (cel cu timpul minim, diferit de 0) va primi P/2 puncte, cel de pe locul al doilea va primi P/2 - 1 … penultimul -P/2 + 1, iar ultimul -P/2 puncte.\\ Fie P numarul de participanti ai unei curse. Acestia vor primi punctaje din intervalul [P/2, -P/2] in functie de pozitia pe care au ocupat-o in clasament astfel: primul (cel cu timpul minim, diferit de 0) va primi P/2 puncte, cel de pe locul al doilea va primi P/2 - 1 … penultimul -P/2 + 1, iar ultimul -P/2 puncte.\\
 +
 +<note important>​Inainte de inceperea campionatului participantii vor fi asezati in clasament in ordinea crescatoare a id-urilor.</​note>​
  
 Exemplu pentru o cursa.\\ Exemplu pentru o cursa.\\
Line 50: Line 58:
 </​note>​ </​note>​
  
-<note important>​In cazul in care 2 concurenti au acelasi timp, vor fi departajati dupa id (cel cu id mai mic este in fata celui cu id mai mare).</​note>​+<note important>​In cazul in care 2 concurenti au acelasi timp, vor fi departajati dupa pozitia ocupata ​in clasamentul anterior cursei actuale. 
 +Clasamentul se va stabili dupa fiecare cursa, nu doar la operatii de print.</​note>​
  
 === Operatii === === Operatii ===
Line 63: Line 72:
    
   * Creati un program care sa il ajute pe Piciorus sa isi urmareasca favoritii din campionatul descris mai sus.   * Creati un program care sa il ajute pe Piciorus sa isi urmareasca favoritii din campionatul descris mai sus.
- 
  
 === Input === === Input ===
Line 71: Line 79:
     * Sirul “print”.     * Sirul “print”.
     * n numere naturale separate printr-un spatiu, reprezentand timpul unui concurent intr-o cursa.     * n numere naturale separate printr-un spatiu, reprezentand timpul unui concurent intr-o cursa.
 +  * Citirea se va face din fisierul races.in
  
 <note tip>Se garanteaza ca vor fi fix m curse si fix k print-uri.</​note>​ <note tip>Se garanteaza ca vor fi fix m curse si fix k print-uri.</​note>​
Line 77: Line 86:
 === Output === === Output ===
  
-  * In fisierul de output se vor gasi n*k linii ( k clasamente),​ fiecare linie continand 3 numere separate printr-un spatiu: ​ ID-ul, Nr. de puncte acumulate de la inceputul campionatului si Diferenta de nivel  din clasament fata de print-ul trecut.+  * In fisierul de output se vor gasi n*(+ 1) linii (k clasamente, dupa fiecare clasament se va afisa o linie goala), fiecare linie continand 3 numere separate printr-un spatiu: ​ ID-ul, Nr. de puncte acumulate de la inceputul campionatului si Diferenta de nivel  din clasament fata de print-ul trecut. 
 +  * Afisarea se va face in fisierul races.out
  
 <note tip>​Pentru primul print Diferenta de nivel va fi 0 pentru toti participantii.</​note>​ <note tip>​Pentru primul print Diferenta de nivel va fi 0 pentru toti participantii.</​note>​
Line 111: Line 121:
  === Restrictii si precizari ===  === Restrictii si precizari ===
  
-  ​TO DO+ <​note warning>**Atenție!** Structurile de date trebuie sa fie implementate generic.</​note>​  
 +  * 0 < n < 1000 
 +=== Teste publice === 
 + 
 + 
 +{{:​sd-ca:​teme:​checker-tema1-2019-v3.zip|}} 
 + 
 +Temele vor trebui trimise pe [[https://​elf.cs.pub.ro/​vmchecker/​ui/#​SD|vmchecker]].  
 +**Atenție!** Temele trebuie trimise în secțiunea **Structuri de Date (CA)**. 
 + 
 +Arhiva trebuie să conțină:​ 
 +  * surse 
 +  * fișier Makefile cu două reguli: 
 +    * regula **build**: în urma căreia se generează un executabil numit **tema1** 
 +    * regula **clean** care şterge executabilul 
 +  * fisier **README** care să conțină detalii despre implementarea temei 
 + 
 +=== Punctaj === 
 + 
 +  - 80p teste 
 +  - **Fiecare** test este verificat cu valgrind. Dacă un test are memory leaks, nu va fi punctat. 
 +  - 20p README + comentarii/​claritate cod (ATENȚIE! Fișierul README trebuie făcut explicit, cât să se înțeleagă ce ați făcut în sursă, dar fără comentarii inutile și detalii inutile) 
 +  - Se acordă 20% din punctajul obținut pe teste, ca bonus pentru coding-style. De exemplu, pentru o temă care obține maxim pe teste, se pot obține 20p bonus dacă nu aveți erori de coding style. Pentru o temă ce trece 8 teste din 10, se pot obține 16p dacă nu aveți erori de coding style. 
 +  - O temă care obține 0p pe vmchecker este punctată cu 0. 
 +<note warning>​**Nu copiați!** Toate soluțiile vor fi verificate folosind o unealtă de detectare a plagiatului. În cazul detectării unui astfel de caz, atât plagiatorul cât și autorul original (nu contează cine care e) vor primi punctaj 0 pe **toate temele**! 
 + 
 +De aceea, vă sfătuim să nu vă lăsați rezolvări ale temelor pe calculatoare partajate (la laborator etc), pe mail/liste de discuții/​grupuri etc.</​note>​  
 + 
 +===== FAQ ===== 
 + 
 +**Q:** Se poate folosi STL? 
 + 
 +**A:** Nu puteți folosi structurile gata implementate în STL. Obiectivul principal al cursului de structuri de date este acela ca voi să implementați structurile respective. 
 + 
 +**Q:** Ce biblioteci putem folosi? 
 + 
 +**A:** Aveți voie să folosiți următoarele biblioteci C/C++: <​iostream>,​ <​fstream>,​ <​cstdio>,​ <​string>,​ <​sstream>,​ <​tuple>,​ <​cstring>,​ <​algorithm>​. Va recomandăm să folosiți <​tuple>,​ pentru a va crea mai ușor structuri în care doar trebuie să stocați date. ([[http://​www.cplusplus.com/​reference/​tuple/​tuple/?​kw=tuple]]) Orice structura de date pe care nu aveți voie să o folosiți, dar o folosiți, vă va aduce 0p pe tema.
  
 === Tutorial Skip List === === Tutorial Skip List ===
  
-  * TO DO +Despre structura de date: 
-</hidden>+ 
 +SkipList este o structura de date care poate sa faca operatia de cautare in O(log n) si insertia ordonata in O(log n). Deci se aproprie de caracteristiciile vectorului in ceea ce priveste cautarea, pastrand totusi avantajele unei liste(inserarea elementelor in O(1)).\\ 
 + 
 +^  Algorithm ​     ^   ​Average ​     ^   Worst case      ^ 
 +|  Space          |   ​O(n) ​        ​| ​  O(n log n)      | 
 +|  Search ​        ​| ​  O(log n)     ​| ​  ​O(n) ​           | 
 +|  Insert ​        ​| ​  O(log n)     ​| ​  ​O(n) ​           | 
 +|  Delete ​        ​| ​  O(log n)     ​| ​  ​O(n) ​           | 
 +\\ 
 +**Principalele operatii:** 
 +\\ 
 +<code> 
 +**Search**(key) ​      
 +    p = top-left node in S 
 +    while (p.below != null) do        ​//Scan down 
 +        p = p.below 
 +        while (key >= p.next) do      //Scan forward 
 +            p = p.next 
 +    return p 
 +</​code>​ 
 + 
 +<​code>​  
 +**Insert**(key) ​                    
 +    p = Search(key) ​                                                                                                                                                                                        
 +    q = null                                                                                                                                                                                                 
 +    i = 1                                                                                                                                                                                                   
 +    repeat ​                                                                                                                                                                                                  
 +        i = i + 1                   //​Height of tower for new element ​                                                                                                                                      
 +        if i >= h                                                                                                                                                                                           
 +            h = h + 1                                                                                                                                                                                       
 +            createNewLevel() ​       //Creates new linked list level                                                                                                                                         
 +        while (p.above == null)                                                                                                                                                                             
 +            p = p.prev ​             //Scan backwards until you can go up                                                                                                                                     
 +        p = p.above ​                                                                                                                                                                                        
 +        q = insertAfter(key,​ p)     //​Insert our key after position p                                                                                                                                       
 +    until CoinFlip() == '​Tails' ​                                                                                                                                                                            
 +    n = n + 1                                                                                                                                                                                               
 +    return q                                                                                                                                                                                                                                                                                                                                                                                        
 +</​code>​ 
 + 
 +<​code> ​                                                                                                                                                                                                          
 +**Delete**(key) ​                                                                                                                                                                                                
 +    Search for all positions p_0, ..., p_i where key exists ​                                                                                                                                                
 +    if none are found                                                                                                                                                                                       
 +        return ​                                                                                                                                                                                              
 +    Delete all positions p_0, ..., p_i                                                                                                                                                                       
 +    Remove all empty layers of skip list 
 +</​code>​ 
 +{{ :​sd-ca:​teme:​screenshot_from_2019-03-04_22-06-08.png?​nolink&​700 |}} 
 + 
 +<note tip>​Linkuri utile:\\ 
 +''​ 
 +https://​people.ok.ubc.ca/​ylucet/​DS/​SkipList.html\\ 
 +                                                                                                                                     
 +https://​www.ics.uci.edu/​~pattis/​ICS-23/​lectures/​notes/​Skip%20Lists.pdf\\ ​                                                                                                                                      
 + 
 +http://​ticki.github.io/​blog/​skip-lists-done-right/​\\ 
 + 
 +https://​www.cs.cmu.edu/​~ckingsf/​bioinfo-lectures/​skiplists.pdf\\ ​                                                                                                                                              
 + 
 +https://​www.youtube.com/​watch?​v=2g9OSRKJuzM\\ ​                                                                                                                                                                
 + 
 +https://​www.youtube.com/​watch?​v=7GWXfL6T3fM\\ 
 +''​ 
 +</​note>​ 
sd-ca/teme/tema1.1551016015.txt.gz · Last modified: 2019/02/24 15:46 by george.popescu0309
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0