Gli ultimi allenamenti prima della fase nazionale stanno per finire e ho incontrato un problema enorme nel riuscire a risolvere Skyline2: pur avendolo risolto sulla carta,non riuscivo infatti a capire come riuscire ad accedere dalla funzione Cambia (quella che doveva restituire 0 o 1 a seconda dei casi) al vettore altezze dichiarato solo in locale dento al main.Come si doveva fare?
Puoi dichiarare variabili globali o funzioni aggiuntive, quindi basta creare un altro vettore e usare quello.
Ho provato anch’io a fare così ma mi diceva che superavo i mermory limits
Con la funzione void Inizializza(int N, int M, int* H)
ti veniva passato l’array H
(o meglio, un puntatore al suo primo elemento).
Un modo per tenere un riferimento permanente ad H
poteva essere salvare il puntatore in un’altra variabile dello stesso tipo:
int* h;
void Inizializza(int N, int M, int* H) {
h = H;
// altro codice
}
int Cambia(int P, int V) {
// qui puoi usare h
}
Comunque, l’errore Execution killed with signal <numero> (could be triggered by violating memory limits)
molto spesso, forse anche troppo spesso, non è legato alla quantità di memoria allocata. Per esempio vedi questo topic.
Come si faceva a copiare il vettore H in un vettore a di interi senza che mi restituisse l’errore?
int h[50002];
void Inizializza(int N, int M, int* H){
for(int i=0;i<N;i++)
h[i]=H[i];
}
Io ho fatto così e non mi ha dato nessun problema
Dando un’occhiata più attenta ho notato che in diverse submission hai ricevuto a volte il signal 8 e altre volte il signal 11. In particolare, nei casi in cui ricevevi signal 8, l’errore era dovuto ad una divisione per zero (per l’esattezza: un operazione di modulo con zero) mentre nei casi in cui ricevevi signal 11, l’errore era dovuto effettivamente alla troppa memoria utilizzata (l’array a
che dichiaravi, facendo un rapido calcolo e tenendo conto che un int sono 4 byte, veniva ad occupare oltre 300 MiB, quando ne sono consentiti 256)