This is an old revision of the document!
Responsabili:
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.
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.
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.
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:
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
Temele vor trebui trimise pe vmchecker. Atenție! Temele trebuie trimise în secțiunea Structuri de Date (CA).
Arhiva trebuie să conțină:
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.
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.
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
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