Eu am sortat ( NlogN ) si apoi ...
am scos O( N ).
Ideea e sa te plimbi cu "2" pointeri in felul urmator.
Daca ai sirul sortat dupa greutatea porcilor descrescator ..
Si sa zicem ca primi 5 porci sunt de culoare 1 ..
O sa fie ceva de genul.
10 1
9 1
8 1
7 1
6 1
Si tu parcurgi cu 1 pointer "varful" stivei .. si vezi ca ai porcul cu greutate 10. - "il scoti"
Apoi mergi in continuare cu al 2-lea pointer si scoti un porc care nu are culoarea '1'.
Apoi cu primul pointer, care arata cel mai mare porc, il scoti ..
Apoi cu pointerul 2 iterezi in continuare.
Acum. ( 1 )
De ce merge?
Daca primi x porci sunt de culoarea 1 .. e clar ca o sa fie scosi in oridnea asta .. porcul 1 .. primul porc care are culoarea != cu 1 .. porcul 2 ... porcul x ..
Acum, dupa ce am terminat un 'sir' ( adica o secventa in care aveam porc de culoare 1 .. altceva .. porc de culoare 1 .. altceva. )
! aici trebuie adaugat faptul ca daca am culorile 1 1 1 2 1 1 1 .. tot un sir am, deoarece toti cei 6 * 1 vor fi scosi conform regulei. adica .. 1 .. altceva ..1 .. altceva .. 1 .. etc. ^^
Acum, dupa ce am terminat sirul, sa zicem ca culoarea mea e '2' ... si SUNT SIGUR ca e cel mai 'valoros' porc.
Unde il gasesc pe urmatorul diferit de 2?
hmm .. Surprinzator, problema are o legatura cu cea cu parantezarile corecte ^^
De ce?
Deoarece se poate reformula aceasta 'subproblema' in felul urmator.
sa zicem ca culoarea celui mai valoros porc este 1

)
Putem reprezenta sirul de culori ca fiind '1' daca culoarea este 1 .. si 0 altfel..
Sa avem exemplu.
1100111001000011111
Si putem spune ca o sa se termine "domnia" sirului ( cum am spus mai sus .. ) 1 altceva ..1 .. altceva .. 1 .. altceva ..
pe pozitia x, astfel incat .. numarul de 1 si de 0 este egal pana la pozitia x, si pozitia x+1 este 0.
Adica .. daca am avea -1 in loc de 0 ..
Ar fi cea mai mare pozitie a.i. suma pana acolo este pozitiva.
Sau cea mai lunga parantezare corecta care incepe de la "inceput" ( de unde incepe sirul ).
xD
Poate ca nu am fost foarte coerent, dar in principiu cam asta ar fi ideea.
Daca suntem la pozitia x, si gasim acea pozitie cheie descrisa mai sus la pasul y .. atunci putem sa punem toti porcii intre x si y, si sa consideram y ca fiind inceputul algoritmului.
Nu putem gasi pozitia 'y' atunci cand numarul de 1 este mai mare decat cel de 0 pe tot parculsul sirului .. Ex: 1101010111
Atunci numaram cati de '0' sunt .. si luam toti porcii marcati cu '0' si acel numar+1 de porci marcati cu '1' ..
Aparent pare destul de greu de implementat .. poate daca se reformuleaza altfel, o sa fie mai ok ..
Dar asa mi s-a parut cel mai usor de explicat.
Craciun Fericit, si Sarbatori Fericite, Infoarena!