Tema1

Responsabili:

Modificări și actualizări

  • 18 martie
    • modificare nume fisiere intrare/iesire in races.in/races.out
    • update checker

Atenite! O tema care nu compileaza va primi 0 puncte.

Obiective

  • Aprofundarea cunoștințelor în utilizarea limbajului C++
  • Implementarea și utilizarea structurilor de date listă, skiplist (generice).

Orice tema ce nu va folosi skipList va primi maxim 5/8 puncte pe test (maxim nota 7/10 pe tema).

Intorducere

Piciorus este pasionat de curse de masini. El are o lista cu n concurenti pe care ii urmareste de-a lungul unui campionat format din m curse. Problema lui Piciorus este ca nu toti concurentii participa la toate cursele si ii este greu sa tina un clasament al acestora. Asa ca va cere voua ca din cand in cand sa afisati clasamentul rezultat in urma curselor desfasurate.

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.
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.

Inainte de inceperea campionatului participantii vor fi asezati in clasament in ordinea crescatoare a id-urilor.

Exemplu pentru o cursa.
n = 6
timpi cursa: 1 5 2 7 0 3
Rezolvare. P = 5, (numarul de participanti la cursa)
id = 1 primeste 2 puncte
id = 2 primeste -1 punct
id = 3 primeste 1 punct
id = 4 primeste -2 puncte
id = 5 primeste 0 puncte pentru ca nu a participat
id = 6 primeste 0 puncte.

Daca P este par atunci niciun concurent nu va primi 0 puncte.
Exemplu
n = 5
1 4 2 3 0
P = 4
id = 1, primeste 2 puncte
id = 2, primeste -2 puncte
id = 3, primeste 1 puncte
id = 4, primeste -1 puncte
id = 5, primeste 0 puncte (pentru ca nu a participat)

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.

Operatii

  • Veti gasi in fisierul de intrare k operatii de tip “print”.
    • O operatie de tip print afiseaza clasamentul in ordinea descrescatoare a punctajelor.
    • Pentru fiecare competitor vor fi afisate 3 numere: ID-ul, Nr. de puncte acumulate de la inceputul campionatului si Diferenta de nivel din clasament fata de print-ul trecut.

Daca un competitor a urcat doua pozitii in clasament fata de print-ul trecut, Diferenta de nivel = 2, iar daca a coborat 3 pozitii, Diferenta de nivel = -3.

Cerinta

  • Creati un program care sa il ajute pe Piciorus sa isi urmareasca favoritii din campionatul descris mai sus.

Input

  • Pe prima linie se vor afla 3 numere n, m si k, reprezentand numarul de competitori, numarul de curse si numarul de print-uri.
  • Pe urmatoarele m + k linii se pot afla:
    • Sirul “print”.
    • n numere naturale separate printr-un spatiu, reprezentand timpul unui concurent intr-o cursa.
  • Citirea se va face din fisierul races.in

Se garanteaza ca vor fi fix m curse si fix k print-uri.

Output

  • In fisierul de output se vor gasi n*(k + 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

Pentru primul print Diferenta de nivel va fi 0 pentru toti participantii.

Exemplu

in:
5 5 2
1 4 2 5 3
7 2 8 9 10
print
0 11 0 4 3
2 5 1 0 4
7 0 3 4 2
print

out:
primul print
1 3 0
2 1 0
3 1 0
5 -2 0
4 -3 0
al doilea print
3 4 2
1 2 -1
5 0 1
2 -2 -2
4 -4 0

Restrictii si precizari

Atenție! Structurile de date trebuie sa fie implementate generic.

  • 0 < n < 1000

Teste publice

checker-tema1-2019-v3.zip

Temele vor trebui trimise pe 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

  1. 80p teste
  2. Fiecare test este verificat cu valgrind. Dacă un test are memory leaks, nu va fi punctat.
  3. 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)
  4. 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.
  5. O temă care obține 0p pe vmchecker este punctată cu 0.

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.

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

Despre structura de date:

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:

**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
 
**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                                                                                                                                                                                                                                                                                                                                                                                       
                                                                                                                                                                                                          
**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

sd-ca/teme/tema1.txt · Last modified: 2019/04/06 19:22 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