Nu aveti permisiuni pentru a descarca fisierul grader_test18.in
Diferente pentru blog/problema-majoritatii intre reviziile #9 si #10
Nu exista diferente intre titluri.
Diferente intre continut:
Alta idee vine de la faptul ca in sirul sortat, elementele de valori egale vor fi pe pozitii consecutive. Astfel numele presedintelui va aparea pe cel putin n/3 + 1 pozitii consecutive. Deci numele presedintelui va aparea sigur pe cel putin una din pozitiile n/3 sau 2n/3 din sir. Astfel putem folosi un algoritm de selectie pentru a gasi in O(n) elementele de pe pozitiile n/3 si 2n/3 si apoi in O(n) putem verifica care dintre acesti doi candidati au castigat.
Dacapresupunemcan epanainun milionamputeala fiecare pas sa incrementam pentru candidatul votat x numerele a[x / 1000] si a[x % 1000]. Acum pentru a determina candidatul castigator, gasim valoarea p pentru care a[x] > n/3 + 1 si valoarea q pentru care a[y] > n/3 + 1, iar castigatorul va fi p * 1000 + q.
Daca n nu depaseste un milion, putem la fiecare pas sa incrementam pentru candidatul votat x numerele a[x / 1000] si a[x % 1000]. Acum pentru a determina candidatul castigator, gasim valoarea p pentru care a[x] > n/3 + 1 si valoarea q pentru care a[y] > n/3 + 1, iar castigatorul va fi p * 1000 + q.
O solutie ar fi sa folosim un hash map ce mapeaza numele alegatorilor la numarul de voturi castigate. Solutia aceasta este eficienta dar foloseste O(n) memorie suplimentara pentru structura de date.
