Problema "robot programmabile" OIS 2016 - Quarta gara

Buonasera!
Volevo chiedere delucidazioni riguardo ad un errore che ricevo nel problema sopracitato. In un primo tempo, come in gara, ricevevo molti “execution timed out” e fin qui ci può stare. La cosa strana è che IN OGNI subtask, il primo testcase me lo dava corretto e i restanti con appunto quell’errore.
Dopo aver sistemato un po il codice, il tempo di esecuzione è calato notevolmente, rientrando nei parametri richiesti, ma ora mi dà “execution killed with signal 11”. So che questo errore salta fuori quando si violano i limiti di memoria, ad esempio usando indici piu grandi della dimensione di un array, senonché nel mio codice l’unico “array” è una stringa, e accedo ad ogni carattere della stringa in un for che va fino a i ‘<’ stringa.length(), e che quindi, credo, non esce dai limiti di memoria. In quali altri casi può saltare fuori quell’errore?

Grazie

Ciao :slightly_smiling:

In certi casi potrebbe capitare anche con una ricorsione infinita

Posso sapere come lo hai implementato per ridurre notevolmente il tempo, invece io ottengo solo 40/100 punti

Come te, io sono rimasto sui 40/100, e so di altri miei amici che hanno lo stesso punteggio. Devo dire però che l’ho abbandonato da settimane, anche se ancora non mi spiego il motivo dell’errore sulla memoria…

Mmm hai provato ad eseguire il programma con un input grande? Non dovrebbe essere difficile generarne uno (stampa comandi random da BFLR e poi stampa tanti comandi di alto livello del tipo 0 N-1, ovvero la situazione peggiore possibile), e in quel modo ti puoi rendere conto se il programma usa tanta RAM, e magari anche il motivo :slightly_smiling:

Ci fai leggere il codice sorgente?

Per ridurre notevolmente il tempo, bisogna trovare un modo di simulare gli M comandi in un tempo più veloce (magari “costante”). È vero che se avessimo un solo comando la soluzione migliore sarebbe quella di simularlo passo per passo, ma siccome i comandi riguardano tutti la stessa sequenza di istruzioni, è possibile precalcolare dei valori che poi ci permettono di sapere cosa comporterà l’esecuzione di un certo intervallo (contiguo) senza dover controllare ogni singolo valore.

Per farlo, ci possiamo appoggiare su un array di “somme prefisse”, ben pensato però per contenere tutte le informazioni richieste dal problema.

Se non conoscete già le somme prefisse, vi conviene provare prima a usarle in casi più semplici, come la somma dei valori di un array di interi e solo dopo ragionare su come sfruttarle per risolvere questo problema.