Differences

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

Link to this comparison view

pa:laboratoare:laborator-02 [2020/03/01 18:38]
darius.neatu [Distante]
pa:laboratoare:laborator-02 [2022/03/01 23:42] (current)
darius.neatu [Laborator 02 : Greedy]
Line 1: Line 1:
 ====== Laborator 02 : Greedy====== ====== Laborator 02 : Greedy======
-Responsabili:​ 
-  * [[neatudarius@gmail.com|Darius Neațu]] 
-  * [[stefanpopa2209@gmail.com | Ștefan Popa]] 
  
-Autori: 
-  * [[rotarualexandruandrei94@gmail.com| Alex Rotaru]] 
-  * [[neatudarius@gmail.com|Darius Neațu]] 
-  * [[visanr95@gmail.com|Radu Vișan]] 
-  * [[cristb@gmail.com|Cristian Banu]] 
-  ​ 
 ===== Obiective laborator ===== ===== Obiective laborator =====
   *Înțelegerea noțiunilor de bază legate de tehnica greedy    *Înțelegerea noțiunilor de bază legate de tehnica greedy
   *Însușirea abilităților de implementare a algoritmilor bazați pe greedy   *Însușirea abilităților de implementare a algoritmilor bazați pe greedy
  
-===== Precizari initiale ​=====+===== Precizări inițiale ​=====
 <​note>​ <​note>​
-Toate exemplele de cod se gasesc in arhiva {{pa:new_pa:demo-lab02.zip}}.+Toate exemplele de cod se găsesc pe pagina [[https://​github.com/​acs-pa/​pa-lab/​tree/​main/​demo/​lab02|pa-lab::demo/lab02]].
  
-Acestea ​apar incorporate si in textul laboratorului pentru a facilita parcurgerea ​cursiva ​laboratorului.+Exemplele de cod apar încorporate și în textul laboratorului pentru a facilita parcurgerea ​cursivă ​acestuia. **ATENȚIE!** Varianta actualizată a acestor exemple se găsește întotdeauna pe GitHub.
 </​note>​ </​note>​
  
-  * Toate bucatile ​de cod prezentate ​in partea ​introductiva ​a laboratorului (inainte ​de exercitii) au fost testate. Cu toate acestea, este posibil ca din cauza mai multor factori (formatare, caractere invizibile puse de browser etc) un simplu copy-paste ​sa nu fie de ajuns pentru a compila codul. +  * Toate bucățile ​de cod prezentate ​în partea ​introductivă ​a laboratorului (înainte ​de exerciții) au fost testate. Cu toate acestea, este posibil ca din cauza mai multor factori (formatare, caractere invizibile puse de browser etc.) un simplu copy-paste ​să nu fie de ajuns pentru a compila codul. 
-  * Va rugam sa incercati si codul din arhiva ​** demo-lab02.zip**, inainte de a raporta ca ceva nu merge:D +  * Vă rugăm să compilați ​**DOAR** codul de pe GitHub. Pentru raportarea problemelorcontactați unul dintre maintaineri.  
-  * Pentru orice problema legata ​de continutul ​acestei pagini, ​va rugam sa dati email unuia dintre responsabili.+  * Pentru orice problemă legată ​de conținutul ​acestei pagini, ​vă rugăm să dați e-mail ​unuia dintre responsabili.
  
 ===== Importanță – aplicații practice ===== ===== Importanță – aplicații practice =====
-În general tehnicile de tip Greedy ​sau Programare Dinamică (lab04) sunt folosite pentru rezolvarea problemelor de optimizare. Acestea pot adresa probleme în sine sau pot fi subprobleme dintr-un algoritm mai mare. De exemplu, algoritmul Dijkstra pentru determinarea drumului minim pe un graf alege la fiecare pas un nod nou urmărind algoritmul greedy.+În general tehnicile de tip greedy ​sau programare dinamică (următoarele laboratoare) sunt folosite pentru rezolvarea problemelor de optimizare. Acestea pot adresa probleme în sine sau pot fi subprobleme dintr-un algoritm mai mare. De exemplu, algoritmul Dijkstra pentru determinarea drumului minim pe un graf alege la fiecare pas un nod nou urmărind algoritmul greedy.
  
-Exista ​însă probleme care ne pot induce în eroare. Astfel, există probleme în care urmărind criteriul ​Greedy ​nu ajungem la soluția optimă. Este foarte important să identificăm cazurile când se poate aplica ​Greedy ​și cazurile când este nevoie de altceva. Alteori această soluție neoptimă este o aproximare suficientă pentru ce avem nevoie. Problemele NP-complete necesita multă putere de calcul pentru a găsi optimul absolut. Pentru a optimiza aceste calcule mulți algoritmi folosesc decizii ​Greedy ​și găsesc un optim foarte aproape de cel absolut.+Există ​însă probleme care ne pot induce în eroare. Astfel, există probleme în care urmărind criteriul ​greedy ​nu ajungem la soluția optimă. Este foarte important să identificăm cazurile când se poate aplica ​greedy ​și cazurile când este nevoie de altceva. Alteori această soluție neoptimă este o aproximare suficientă pentru ce avem nevoie. Problemele NP-complete necesita multă putere de calcul pentru a găsi optimul absolut. Pentru a optimiza aceste calcule mulți algoritmi folosesc decizii ​greedy ​și găsesc un optim foarte aproape de cel absolut.
  
 ===== Greedy ===== ===== Greedy =====
  
-“greedy” = “lacom”. Algoritmii de tip greedy vor să construiască într-un mod cât mai rapid soluția unei probleme. Ei se caracterizează prin luarea unor decizii rapide care duc la găsirea unei soluții ​potențiale a problemei. Nu întotdeauna asemenea decizii rapide duc la o soluție optimă; astfel ne vom concentra atenția pe identificarea acelor anumite tipuri de probleme pentru care se pot obține soluții optime. +“greedy” = “lacom”. Algoritmii de tip greedy vor să construiască într-un mod cât mai rapid soluția unei probleme. Ei se caracterizează prin luarea unor decizii rapide care duc la găsirea unei potențiale ​soluții ​a problemei. Nu întotdeauna asemenea decizii rapide duc la o soluție optimă; astfel ne vom concentra atenția pe identificarea acelor anumite tipuri de probleme pentru care se pot obține soluții optime. 
-În general ​exista ​mai multe soluții posibile ale problemei. Dintre acestea se pot selecta doar anumite soluții optime, conform unor anumite criterii. Algoritmii greedy se numără printre cei mai direcți algoritmi posibili. Ideea de bază este simplă: având o problema ​de optimizare, de calcul al unui cost minim sau maxim, se va alege la fiecare pas decizia cea mai favorabilă,​ fără a evalua global eficiența soluţiei. ​ Scopul este de a găsi una dintre acestea sau dacă nu este posibil, atunci o soluție cât mai apropiată, conform criteriului optimal impus.+În general ​există ​mai multe soluții posibile ale problemei. Dintre acestea se pot selecta doar anumite soluții optime, conform unor anumite criterii. Algoritmii greedy se numără printre cei mai direcți algoritmi posibili. Ideea de bază este simplă: având o problemă ​de optimizare, de calcul al unui cost minim sau maxim, se va alege la fiecare pas decizia cea mai favorabilă,​ fără a evalua global eficiența soluţiei. Scopul este de a găsi una dintre acestea sau dacă nu este posibil, atunci o soluție cât mai apropiată, conform criteriului optimal impus.
  
-Trebuie înțeles faptul ​ca rezultatul obținut este optim doar dacă un optim local conduce la un optim global. În cazul în care deciziile de la un pas influențează lista de decizii de la pasul următor, este posibila ​obținerea unei valori neoptimale. În astfel de cazuri, pentru găsirea unui optim absolut se ajunge la soluții supra-polinomiale. De aceea, dacă se optează pentru o astfel de soluție, algoritmul trebuie însoțit de o demonstrație de corectitudine.+Trebuie înțeles faptul ​că rezultatul obținut este optim doar dacă un optim local conduce la un optim global. În cazul în care deciziile de la un pas influențează lista de decizii de la pasul următor, este posibilă ​obținerea unei valori neoptimale. În astfel de cazuri, pentru găsirea unui optim absolut se ajunge la soluții supra-polinomiale. De aceea, dacă se optează pentru o astfel de soluție, algoritmul trebuie însoțit de o demonstrație de corectitudine.
 Descrierea formală a unui algoritm greedy este următoarea:​ Descrierea formală a unui algoritm greedy este următoarea:​
  
Line 52: Line 43:
 </​code>​ </​code>​
  
-Este ușor de înțeles acum de ce acest algoritm se numește ”greedy”:​ la fiecare pas se alege cel mai bun candidat de la momentul respectiv, fără a studia alternativele disponibile în moment ​respectiv şi viabilitatea acestora în timp.+Este ușor de înțeles acum de ce acest algoritm se numește ”greedy”:​ la fiecare pas se alege cel mai bun candidat de la momentul respectiv, fără a studia alternativele disponibile în momentul ​respectiv şi viabilitatea acestora în timp.
  
 Dacă un candidat este inclus în soluție, rămâne acolo, fără a putea fi modificat, iar dacă este exclus din soluție, nu va mai putea fi niciodată selectat drept un potențial candidat. Dacă un candidat este inclus în soluție, rămâne acolo, fără a putea fi modificat, iar dacă este exclus din soluție, nu va mai putea fi niciodată selectat drept un potențial candidat.
Line 60: Line 51:
 ==== Simple task ==== ==== Simple task ====
  
-=== Enunt ===+=== Enunț ​===
 Fie un șir de N numere pentru care se cere determinarea unui subșir de numere cu suma maximă. Un subșir al unui șir este format din elemente (nu neapărat consecutive) ale șirului respectiv, în ordinea în care acestea apar în șir. Fie un șir de N numere pentru care se cere determinarea unui subșir de numere cu suma maximă. Un subșir al unui șir este format din elemente (nu neapărat consecutive) ale șirului respectiv, în ordinea în care acestea apar în șir.
  
Line 67: Line 58:
 </​spoiler>​ </​spoiler>​
  
-=== Solutie ​=== +=== Soluție ​=== 
-Se observa ca tot ce avem de făcut este sa verificam ​fiecare număr dacă este pozitiv sau nu. În cazul pozitiv, îl introducem în subșirul soluție.+Se observă că tot ce avem de făcut este să verificăm ​fiecare număr dacă este pozitiv sau nu. În cazul pozitiv, îl introducem în subșirul soluție.
  
-Daca toate numerele sunt negative, ​solutia ​este data de cel mai mare numar negativ (cel mai mic in modul).+Dacă toate numerele sunt negative, ​soluția ​este dată de cel mai mare numar negativ (cel mai mic în modul).
  
  
 ==== Problema spectacolelor ==== ==== Problema spectacolelor ====
-=== Enunt ===+=== Enunț ​===
 Se dau mai multe spectacole, prin timpii de start și timpii de final. Se cere o planificare astfel încât o persoană să poată vedea cât mai multe spectacole. ​ Se dau mai multe spectacole, prin timpii de start și timpii de final. Se cere o planificare astfel încât o persoană să poată vedea cât mai multe spectacole. ​
  
-=== Solutie ​=== +=== Soluție ​=== 
-Rezolvarea constă în **sortarea** spectacolelor crescător după timpii de final, apoi la fiecare pas se alege **primul spectacol** care are timpul de start mai mare decât ultimul timp de final. Timpul inițial de final este inițializat la $-\inf$ (spectacolul care se termină cel mai devreme va fi mereu selectat, având ​timp de start mai mare decât timpul inițial). ​+Rezolvarea constă în **sortarea** spectacolelor crescător după timpii de final, apoi la fiecare pas se alege **primul spectacol** care are timpul de start mai mare decât ultimul timp de final. Timpul inițial de final este inițializat la $-\inf$ (spectacolul care se termină cel mai devreme va fi mereu selectat, având ​timpul ​de start mai mare decât timpul inițial). ​
  
 === Implementare === === Implementare ===
Line 113: Line 104:
  
 === Complexitate === === Complexitate ===
-Solutia ​va avea urmatoarele complexitati+Soluția ​va avea următoarele complexități
-  * ** complexitate ​temporala ​**: $T(n) = O(n * log(n))$ +  * ** complexitate ​temporală ​**: $T(n) = O(n * log(n))$ 
-    * explicatie+    * explicație
       * sortarea are $O(n * log(n))$       * sortarea are $O(n * log(n))$
-      * facem inca o parcurgere ​in $O(n)$ +      * facem încă ​o parcurgere ​în $O(n)$ 
-  * ** complexitate ​spatiala ​**: depinde de algoritmul de sortare folosit.+  * ** complexitate ​spațială ​**: depinde de algoritmul de sortare folosit.
  
 ==== Problema florarului ==== ==== Problema florarului ====
-=== Enunt === +=== Enunț ​=== 
-Se da un grup de $k$ oameni care vor sa cumpere ​impreuna ​$n$ flori. Fiecare floare are un pret de bazainsa pretul ​cu care este cumparata variaza in functie ​de numarul ​de flori cumparate ​anterior de persoana ​respectiva. De exemplu ​daca George a cumparat $3$ flori (diferite) ​si vrea sa cumpere o floare cu pretul ​$2$, el va plati $(3 + 1) * 2 = 8$. Practic el va plati un pret proportional ​cu numarul ​flori cumparate pana atunci tot de el.+Se dă un grup de $k$ oameni care vor să cumpere ​împreună ​$n$ flori. Fiecare floare are un preț de bazăînsă prețul ​cu care este cumpărată variază în funcție ​de numărul ​de flori cumpărate ​anterior de persoana ​respectivă. De exemplu ​dacă George a cumparat $3$ flori (diferite) ​și vrea să cumpere o floare cu prețul ​$2$, el va plăti ​$(3 + 1) * 2 = 8$. Practic el va plăti ​un preț proporțional ​cu numărul de flori cumpărate până ​atunci tot de el.
  
-Cerinta+Cerința
-Se cere pentru un numar $k$ de oameni ​si $n$ flori se cere sa se deterimne ​care este costul minim cu care grupul poate sa achizitioneze ​toate cele $n$ flori o singura data.+Se cere pentru un număr ​$k$ de oameni ​și $n$ flori să se determine ​care este costul minim cu care grupul poate să achiziționeze ​toate cele $n$ flori o singură dată.
  
-Observatie: Un tip de floare se cumpara ​singura data. O persoana ​poate cumpara ​mai multe tipuri de flori. ​In final in grup va exista un singur exemplar din fiecare tip de floare.+Observație: Un tip de floare se cumpără ​singură dată. O persoană ​poate cumpăra ​mai multe tipuri de flori. ​În final în grup va exista un singur exemplar din fiecare tip de floare.
  
-Formal avem $k$ numar de oameni, $n$ numar de flori, $c[i]$ = pretul florii de tip $i$, costul de cumparare ​$i$ va fi $(x + 1) * c[i]$, unde $x$ este numarul ​de flori cumparate ​anterior de persoana ​respectiva.+Formal avem $k$ număr ​de oameni, $n$ număr ​de flori, $c[i]$ = pretul florii de tip $i$, costul de cumpărare ​$i$ va fi $(x + 1) * c[i]$, unde $x$ este numărul ​de flori cumpărate ​anterior de persoana ​respectivă.
  
 <spoiler Exemplu> <spoiler Exemplu>
Line 137: Line 128:
 Cost minim = 13 Cost minim = 13
  
-Explicatie: Fiecare individ ​cumpara cate o floare ​si deci acestea se cumpara ​la pretul ​nominal.+Explicație: Fiecare individ ​cumpără câte o floaredeci acestea se cumpăra ​la prețul ​nominal.
 </​spoiler>​ </​spoiler>​
  
-=== Solutie ​=== +=== Soluție ​=== 
-Se observa ca pretul ​efectiv de cumpare ​va fi mai mare cu cat cumparam ​acea floare mai tarziu. ​Daca consideram ​cazul in care avem o singura persoana in grup observam ca are sens sa cumparam ​obiectele ​in ordine ​descrescatoare(deoarece vrem sa minimizam ​costul ​fiecarui ​tip de flori si aceste creste ​cu cat cumparam ​floarea mai tarziu).+Se observă că prețul ​efectiv de cumpărare ​va fi mai mare cu cât cumpărăm ​acea floare mai tarziu. ​Dacă considerăm ​cazul în care avem o singură persoană în grup observăm că are sens să cumpărăm ​obiectele ​în ordine ​descrescătoare ​(deoarece vrem să minimizăm ​costul ​fiecărui ​tip de floare, acesta crește ​cu cât cumpărăm ​floarea mai tarziu).
  
-De aici, gandindu-ne la versiunea cu $k$ persoane, ​observam ca ar fi mai ieftin ​daca am repartiza ​urmatoarea ​cea mai scumpa floare la alt individ. Deci impartim ​florile sortate ​descrescator dupa pret in grupuri de cate $k$, fiecare individ ​luand o floare din acest grup si ne asiguram ca pretul ​va creste doar in functie ​de numarul ​de grupuri anterioare.+De aici, gândindu-ne la versiunea cu $k$ persoane, ​observăm că ar fi mai ieftin ​dacă am repartiza ​următoarea ​cea mai scumpa floare la alt individ. Deci împărțim ​florile sortate ​descrescător după pret în grupuri de câte $k$, fiecare individ ​luând ​o floare din acest grup și ne asigurăm că prețul ​va creste doar in funcție ​de numărul ​de grupuri anterioare.
  
  
Line 185: Line 176:
  
 === Complexitate === === Complexitate ===
-Solutia ​va avea urmatoarele complexitati+Soluția ​va avea următoarele complexități
-  * ** complexitate ​temporala ​**: $T(n) = O(n * log(n))$ +  * ** complexitate ​temporală ​**: $T(n) = O(n * log(n))$ 
-    * explicatie+    * explicație
       * sortarea are $O(n * log(n))$       * sortarea are $O(n * log(n))$
-      * facem inca o parcurgere ​in $O(n)$ +      * facem încă ​o parcurgere ​în $O(n)$ 
-  * ** complexitate ​spatiala ​**: depinde de algoritmul de sortare folosit. ​Fara partea de sortare, ​spatiul ​este constant (nu se ia in considerare vectorul de elemente).+  * ** complexitate ​spațială ​**: depinde de algoritmul de sortare folosit. ​Fără ​partea de sortare, ​spațiul ​este constant (nu se ia în considerare vectorul de elemente).
  
  
  
 ==== Problema cuielor ==== ==== Problema cuielor ====
-=== Enunt ===+=== Enunț ​===
 Fie $N$ scânduri de lemn, descrise ca niște **intervale închise** cu capete reale. Găsiți o mulțime **minimă** de cuie astfel încât fiecare scândură să fie bătută de cel puțin un cui. Se cere poziția cuielor. Fie $N$ scânduri de lemn, descrise ca niște **intervale închise** cu capete reale. Găsiți o mulțime **minimă** de cuie astfel încât fiecare scândură să fie bătută de cel puțin un cui. Se cere poziția cuielor.
    
Line 204: Line 195:
   * intrare: N = 5, intervalele:​ [0, 2], [1, 7], [2, 6], [5, 14], [8, 16]   * intrare: N = 5, intervalele:​ [0, 2], [1, 7], [2, 6], [5, 14], [8, 16]
   * ieșire: M = {2, 14}   * ieșire: M = {2, 14}
-  * explicație:​ punctul 2 se afla în primele 3 intervale, iar punctul 14 în ultimele 2+  * explicație:​ punctul 2 se află în primele 3 intervale, iar punctul 14 în ultimele 2
 </​spoiler>​ </​spoiler>​
  
-=== Solutie ​=== +=== Soluție ​=== 
-Se observa ​că dacă $x$ este un punct din $M$ care nu este capăt dreapta al nici unui interval, o translație a lui $x$ la dreapta care îl duce în capătul dreapta cel mai apropiat nu va schimba intervalele care conțin punctul. Prin urmare, ​exista ​o mulțime de cardinal minim $M$ pentru care toate punctele $x$ sunt capete dreapta.+Se observă ​că dacă $x$ este un punct din $M$ care nu este capăt dreapta al niciunui ​interval, o translație a lui $x$ la dreapta care îl duce în capătul dreapta cel mai apropiat nu va schimba intervalele care conțin punctul. Prin urmare, ​există ​o mulțime de cardinal minim $M$ pentru care toate punctele $x$ sunt capete dreapta.
  
 Astfel, vom crea mulțimea $M$ folosind numai capete dreapta în felul următor: Astfel, vom crea mulțimea $M$ folosind numai capete dreapta în felul următor:
-  * sortăm intervalele dupa capatul ​dreapta+  * sortăm intervalele dupa capătul ​dreapta
   * iterăm prin fiecare interval și dacă intervalul curent nu conține ultimul punct introdus în mulțime atunci îl adăugam pe acesta la mulțime   * iterăm prin fiecare interval și dacă intervalul curent nu conține ultimul punct introdus în mulțime atunci îl adăugam pe acesta la mulțime
  
Line 239: Line 230:
             // il adaugam in multimea M             // il adaugam in multimea M
             nails.push_back(interval.second);​             nails.push_back(interval.second);​
-            // updatam ultimul ​punt inserat+            // updatam ultimul ​punct inserat
             last_point = interval.second;​             last_point = interval.second;​
         }         }
Line 251: Line 242:
 === Complexitate === === Complexitate ===
 Soluția va avea următoarele complexități:​ Soluția va avea următoarele complexități:​
-  * ** complexitate ​temporala ​**: $T(n) = O(n * log(n))$+  * ** complexitate ​temporală ​**: $T(n) = O(n * log(n))$
     * explicație     * explicație
       * sortare: $O(n * log n)$       * sortare: $O(n * log n)$
Line 257: Line 248:
   * ** complexitate spațială **: depinde de algoritmul de sortare folosit.   * ** complexitate spațială **: depinde de algoritmul de sortare folosit.
  
 +
 +Problema se poate testa pe leetcode: [[https://​leetcode.com/​problems/​minimum-number-of-arrows-to-burst-balloons/​|Minimum Number of Arrows to Burst Balloons]] (altă poveste).
  
 ===== Concluzii şi observații ===== ===== Concluzii şi observații =====
-Aspectul cel mai important de reținut este că soluțiile găsite trebuie să reprezinte optimul global ​și nu doar local. Se pot confunda ușor problemele care se rezolvă cu Greedy ​cu cele care se rezolvă prin Programare Dinamică (vom vedea saptamana ​viitoare).+Aspectul cel mai important de reținut este că soluțiile găsite trebuie să reprezinte optimul global, ci nu doar local. Se pot confunda ușor problemele care se rezolvă cu greedy ​cu cele care se rezolvă prin programare dinamică (vom vedea săptămâna ​viitoare).
  
  
 ===== Exercitii ===== ===== Exercitii =====
 <​note>​ <​note>​
-In acest laborator vom folosi scheletul ​de laborator ​din arhiva {{pa:new_pa:skel-lab02.zip}}.+Scheletul ​de laborator ​se găsește pe pagina [[https://​github.com/​acs-pa/​pa-lab/​tree/​main/​skel/​lab02|pa-lab::skel/lab02]].
 </​note>​ </​note>​
- 
- 
-<​note>​ 
-ATENTIE! Au aparut modificari minore la checker. Rulati comanda `./​check.sh` si recititi documentatia afisata. 
-</​note>​ 
- 
 ==== Rucsac ==== ==== Rucsac ====
-Fie un set  cu $ n $ obiecte (care pot fi **taiate** - varianta ​continua ​a problemei). Fiecare obiect $i$ are asociata ​o pereche ($w_i, p_i$) cu semnificatia+Fie un set  cu $ n $ obiecte (care pot fi **tăiate** - varianta ​continuă ​a problemei). Fiecare obiect $i$ are asociată ​o pereche ($w_i, p_i$) cu semnificația
-  * $w_i$ = $weight_i$ = greutatea obiectului cu numarul ​$i$ +  * $w_i$ = $weight_i$ = greutatea obiectului cu numărul ​$i$ 
-  * $p_i$ = $price_i$ = pretul ​obiectului cu numarul ​$i$+  * $p_i$ = $price_i$ = prețul ​obiectului cu numărul ​$i$
       * $w_i >= 0$ si $p_i > 0$       * $w_i >= 0$ si $p_i > 0$
  
-Gigel are la dispozitie ​un rucsac de **volum infinit**, dar care suporta ​o **greutate ​maxima** (notata ​cu $W$ - weight knapsack).+Gigel are la dispoziție ​un rucsac de **volum infinit**, dar care suportă ​o **greutate ​maximă** (notată ​cu $W$ - weight knapsack).
  
-El vrea sa gaseasca ​**o submultime ​ de obiecte** (nu neaparat intregi) pe care sa le bage in rucsac, astfel ​incat suma profiturilor ​sa fie **maxima**.+El vrea să găsească ​**o submulțime ​ de obiecte** (nu neapărat întregi) pe care să le bage în rucsac, astfel ​încât ​suma profiturilor ​să fie **maximă**.
  
-Daca Gigel baga in rucsac obiectul $i$, caracterizat de ($w_i, p_i$), atunci profitul adus de obiect este $p_i$ (presupunem ​ca il vinde cu cat valoareaza).+Dacă Gigel bagă în rucsac obiectul $i$, caracterizat de ($w_i, p_i$), atunci profitul adus de obiect este $p_i$ (presupunem ​că îl vinde cu cât valoarează).
  
-In aceasta varianta ​a problemei, Gigel poate taia oricare dintre obiecte, ​obtinand ​proportie ​din acesta. ​Daca Gigel alege alege doar $x$ din greutatea $w_i$ a obiectului $i$, atunci el castiga ​doar $\frac{x}{w_i} * p_i$.+În această variantă ​a problemei, Gigel poate tăia oricare dintre obiecte, ​obținând ​proporție ​din acesta. ​Dacă Gigel alege doar $x$ din greutatea $w_i$ a obiectului $i$, atunci el câștigă ​doar $\frac{x}{w_i} * p_i$.
  
 Task-uri: Task-uri:
-  * Sa se determine profitul maxim pentru Gigel. +  * Să se determine profitul maxim pentru Gigel. 
-  * Care este complexitatea ​solutiei ​(timp + spatiu)? De ce?+  * Care este complexitatea ​soluției ​(timp + spatiu)? De ce?
  
 <spoiler Exemplu 1> <spoiler Exemplu 1>
Line 298: Line 285:
  
 Output: 12.5 Output: 12.5
-Explicatie: avem 50 capacitate ​si toate obiectele au o greutatate mai mare, decidem ​sa luam cat putem din produsul cu raportul valoare /  greutate cel mai mare.  ​profitu ​= 30 / 120 * 50 = 12.5+Explicație: avem 50 capacitate ​și toate obiectele au o greutatate mai mare, decidem ​să luăm cât putem din produsul cu raportul valoare /  greutate cel mai mare.  ​profit ​= 30 / 120 * 50 = 12.5
 </​spoiler>​ </​spoiler>​
  
Line 310: Line 297:
  
 Output: 180 Output: 180
-Explicatie+Explicație
-Sortam ​obiectele ​dupa raportul valoare profit si avem in ordine: {30, 120}, {20, 60}, {50, 100} +Sortăm ​obiectele ​după raportul valoare ​profit si avem în ordine: {30, 120}, {20, 60}, {50, 100}. 
-Introducem obiecte ​pana cand umplem sacul => intra primele 2 obiecte. ​Calculam ​profitul 120 + 60 = 180+Introducem obiecte ​până când umplem sacul => intră ​primele 2 obiecte. ​Calculăm ​profitul 120 + 60 = 180
 </​spoiler>​ </​spoiler>​
  
  
-==== Distante ​==== +==== Distanțe ​==== 
-Consideram ​localitati ​$A$ si $B$ aflate la distanta ​$D$. Intre cele 2 localitati ​avem un numar de $n$ benzinarii, date prin distanta fata de localitatea $A$. Masina ​cu care se efectueaza ​deplasarea ​intre cele 2 localitati ​poate parcurge maxim $m$ kilometri ​avand rezervorul plin la inceput. Se doreste ​parcurgerea drumului cu un numar minim de opriri la benzinarii ​pentru realimentare (dupa fiecare oprire la o benzinariemasina pleaca ​cu rezervorul plin).+Considerăm ​localități ​$A$ și $B$ aflate la distanța ​$D$. Între ​cele 2 localități ​avem un număr ​de $n$ benzinării, date prin distanța față ​de localitatea $A$. Mașina ​cu care se efectuează ​deplasarea ​între ​cele 2 localități ​poate parcurge maxim $m$ kilometri ​având ​rezervorul plin la început. Se dorește ​parcurgerea drumului cu un număr ​minim de opriri la benzinării ​pentru realimentare (după fiecare oprire la o benzinăriemașina pleacă ​cu rezervorul plin).
  
-Distantele catre benzinarii ​se reprezinta ​printr-o ​lista de forma $0 < d1 < d2 < ... < dn$, unde $di$ ($1 <= i <= n$) reprezinta distanta ​de la $A$ la benzinaria ​$i$. Pentru simplitate, se considera ca localitatea $A$ se afla la $0$, iar $dn = D$ (localitatea $B$ se afla in acelasi ​loc cu ultima ​benzinarie).+Distanțele către benzinării ​se reprezintă ​printr-o ​listă ​de forma $0 < d1 < d2 < ... < dn$, unde $di$ ($1 <= i <= n$) reprezintă distanța ​de la $A$ la benzinăria ​$i$. Pentru simplitate, se consideră că localitatea $A$ se află la $0$, iar $dn = D$ (localitatea $B$ se află in același ​loc cu ultima ​benzinărie).
  
-Se garanteaza ca exista ​o planificare ​valida ​a opririlor astfel ​incat sa se poata ajunge la localitatea $B$.+Se garantează că există ​o planificare ​validă ​a opririlor astfel ​încât să se poată ​ajunge la localitatea $B$.
  
 <​hidden>​ <​hidden>​
Line 335: Line 322:
  
  
-Raspunsul ​este $3$, efectuand ​3 opriri la a 2-a, a 3-a, respectiv a 4-a benzinarie.+Răspunsul ​este $3$, efectuând ​3 opriri la a 2-a, a 3-a, respectiv a 4-a benzinărie.
 </​spoiler>​ </​spoiler>​
  
Line 342: Line 329:
 ==== Teme la ACS ==== ==== Teme la ACS ====
  
-Pe parcursul unui semestru, un student are de rezolvat $n$ teme (nimic nou pana aici...). Se cunosc enunțurile tuturor celor $n$ teme de la **începutul semestrului**. ​+Pe parcursul unui semestru, un student are de rezolvat $n$ teme (nimic nou până ​aici...). Se cunosc enunțurile tuturor celor $n$ teme de la **începutul semestrului**. ​
  
-Timpul de rezolvare pentru oricare dintre teme este de **o săptămână** și **nu** se poate lucra la mai multe teme în același timp. Pentru fiecare ​tema se cunoaște un termen ​limita ​$d[i]$ (exprimat în săptămâni - deadline pentru tema $i$) și un punctaj $p[i]$. ​+Timpul de rezolvare pentru oricare dintre teme este de **o săptămână** și **nu** se poate lucra la mai multe teme în același timp. Pentru fiecare ​temă se cunoaște un termen ​limită ​$d[i]$ (exprimat în săptămâni - deadline pentru tema $i$) și un punctaj $p[i]$. ​
  
 Nicio fracțiune din punctaj nu se mai poate obține după expirarea termenului limită. ​ Nicio fracțiune din punctaj nu se mai poate obține după expirarea termenului limită. ​
Line 350: Line 337:
 Task-uri: Task-uri:
   * Să se definească o planificare de realizare a temelor, în așa fel încât punctajul obținut să fie **maxim**.   * Să se definească o planificare de realizare a temelor, în așa fel încât punctajul obținut să fie **maxim**.
-  * Care este complexitatea ​solutiei ​(timp + spatiu)? De ce?+  * Care este complexitatea ​soluției ​(timp + spațiu)? De ce?
  
  
Line 360: Line 347:
 Output: ​ $1 + 4 + 5 + 5 + 8 = 23$ Output: ​ $1 + 4 + 5 + 5 + 8 = 23$
  
-Explicatie: Putem face toate temele deoarece ​pana ajungem la deadline-urile lor avem suficiente ​unitati ​de timp.+Explicație: Putem face toate temele deoarece ​până ​ajungem la deadline-urile lor avem suficiente ​unități ​de timp.
 </​spoiler>​ </​spoiler>​
  
Line 370: Line 357:
 Output: $5 + 6 + 9 + 10 + 2 + 4 + 6 = 42$ Output: $5 + 6 + 9 + 10 + 2 + 4 + 6 = 42$
  
-ExplicatiePana in deadline 3 avem la dispozitie ​unitati ​de timp si 4 teme. Deci sortam dupa punctaj ​si le includem pe cele mai valoroase: 5, 6 ,9. Pana la deadline 9 avem la dispoztie ​unitati ​de timp si 4 teme. Le includem pe toate.+ExplicațiePână în deadline 3 avem la dispoziție ​unități ​de timp și 4 teme. Deci sortăm după punctaj ​și le includem pe cele mai valoroase: 5, 6, 9. Până ​la deadline 9 avem la dispoziție ​unități ​de timp și 4 teme. Le includem pe toate.
 </​spoiler>​ </​spoiler>​
  
Line 377: Line 364:
  
 ==== BONUS  ==== ==== BONUS  ====
-Rezolvati ​problema [[http://​codeforces.com/​problemset/​problem/​779/​C | Dishonest Sellers]].+Rezolvați ​problema [[http://​codeforces.com/​problemset/​problem/​779/​C | Dishonest Sellers]].
  
 Hint: [[http://​codeforces.com/​blog/​entry/​50724 | aici ]]. Hint: [[http://​codeforces.com/​blog/​entry/​50724 | aici ]].
Line 384: Line 371:
 <spoiler MaxSum> <spoiler MaxSum>
  
-Incercati ​problema [[https://​www.hackerrank.com/​contests/​test-practic-pa-2017-v1-plumbus/​challenges/​1-1-usoare | MaxSum ]] de la test PA 2017.+Incercați ​problema [[https://​www.hackerrank.com/​contests/​test-practic-pa-2017-v1-plumbus/​challenges/​1-1-usoare | MaxSum ]] de la test PA 2017.
  
 </​spoiler>​ </​spoiler>​
  
 <spoiler MyPoints>​ <spoiler MyPoints>​
-Problema 1 de la tema PA 2017. Puteti descarca enuntul si checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].+Problema 1 de la tema PA 2017. Puteți descărca enunțul și checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].
 </​spoiler>​ </​spoiler>​
  
  
 <spoiler Stropitorile lui Gigel> <spoiler Stropitorile lui Gigel>
-Problema 3 de la tema PA 2017. Puteti descarca enuntul si checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].+Problema 3 de la tema PA 2017. Puteți descărca enunțul și checkerul de [[https://​ocw.cs.pub.ro/​courses/​_media/​pa/​teme/​pa2017_tema1.zip|aici]].
 </​spoiler>​ </​spoiler>​
-===== Referințe ===== 
  
-[0Capitolul **Greedy Algorithms** din **Introductions to Algorithms** de către T. H. Cormen, C. E. Leiserson, R. L. Rivest, C. Stein+<spoiler Two City Scheduling>​ 
 +Puteți rezolva această problemă pe [[https://​leetcode.com/​problems/​two-city-scheduling/​ | leetcode]
 +</​spoiler>​
  
-[1] [[http://​en.wikipedia.org/​wiki/​Greedy_algorithm]]+===== Referințe =====
  
-[2[[http://​ww3.algorithmdesign.net/​handouts/​Greedy.pdf]]+[0Chapter **Greedy Algorithms**,​ “Introduction to Algorithms”,​ Thomas HCormen, Charles ELeiserson, Ronald LRivest and Clifford Stein
  
pa/laboratoare/laborator-02.1583080713.txt.gz · Last modified: 2020/03/01 18:38 by darius.neatu
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