Quindi in pratica faccio la simulazione come richiesto dal problema.
le funzioni is_cookable e cook_it vengono eseguite in O(N) dove N è al massimo 8 add_queue anche viene eseguito in poco più di O(N), perchè copio il vettore A nella coda che è così strutturata:
struct order { int ord, N; int A[8]; };
deque<order> Q;
mentre elaborate_queue varia in base alla dimenzione della deque
void elaborate_queue() { int size = Q.size(); for(int i = 0; i < size; i++) { if(is_cookable(Q[i].N, Q[i].A)) { cook_it(Q[i].N, Q[i].A); Bake(Q[i].ord); Q.erase(Q.begin()+i); break; } } return; }
Ora, per far si che non sfori il tempo di esecuzione, usando questo algoritmo dovrei trovare un modo di avere una coda il cui primo elemento è sempre un ordine che può essere preparato, in questo modo evito la ricerca nell’intera coda.
Il punto è che come posso farlo??
Il problema visto sotto un altro punto di vista potrebbe somigliare ad un problema di query ed update…ma non so…
Usando il bitmasking il check passa da O(N) a O(1). Ma ciò che veramente importante è questo: nota che i tipi di pizze sono solo 256 (2^8) mentrebil numero di pizze può arrivare a 100000. Quindi…
Ora ho: is_cookable in O(1); cook_it in O(N); //perchè comunque devo tenere per forza un array di interi per tenere conto di QUANTI ingredienti ho. add_queue in O(1);
e risolvo un testcase in più.
gli ultimi 2 li salta ancora.
Ora la struttura della coda è questa:
struct order { int ord; char I; }; list<order> Q;
tengo con un char gli ingredienti della pizza e così controllo se la pizza si puù fare:
Ora ho: is_cookable in O(1); cook_it in O(N); //perchè comunque devo tenere per forza un array di interi per tenere conto di QUANTI ingredienti ho. add_queue in O(1);
e risolvo un testcase in più.
gli ultimi 2 li salta ancora.
Ora la struttura della coda è questa:
struct order { int ord; char I; }; list<order> Q;
tengo con un char gli ingredienti della pizza e così controllo se la pizza si puù fare:
E in che modo tengo conto dell’ordine delle pizze?
dovrei avere tipo una struttura del genere: priority_queue< priority_queue<int, vector<int>, greater<int> >, vector< priority_queue<int> >, priority_cmp> Q;
una coda di priopriorità di una coda di priorità la coda contiene al più 256 elementi, (i tipi di pizza) e ogni “tipo” contiene una coda con il numero degli ordini delle pizze di quel tipo (ordinate dal più piccolo al più grande)
E in che modo tengo conto dell'ordine delle pizze?
dovrei avere tipo una struttura del genere: priority_queue< priority_queue<int, vector<int>, greater<int> >, vector< priority_queue<int> >, priority_cmp> Q;
una coda di priopriorità di una coda di priorità la coda contiene al più 256 elementi, (i tipi di pizza) e ogni "tipo" contiene una coda con il numero degli ordini delle pizze di quel tipo (ordinate dal più piccolo al più grande)
Ma sono dubbioso di questa struttura O:
simone.pri
Assolutamente no! Ti basta un array di vector lungo 256 posizioni. Ad ogni pizza corrisponde un posto nell'array e nel vector corrispondente fai il push del numero degli ordini (che sarà, ovviamente, ordinato dato che le pizze vengono date in ordine)
In realtà ,poi, è la prima cosa a cui avevo pensato, solo che mi sembrava che l’elaborate impiegasse 256*256 invece giustamente basta solo una ricerca di 256
In realtà ,poi, è la prima cosa a cui avevo pensato, solo che mi sembrava che l'elaborate impiegasse 256*256 invece giustamente basta solo una ricerca di 256