Base Conversion - Execution killed with signal 11

Sinceramente non so come risolvere questo problema
inizialmente ho fatto 30/100 punti siccome sforavo con il tempo, poi ho pensato di non far ripetere il procedimento per ogni numero facendo una sola verifica fino al numero più alto e verificando volta per volta se fossi arrivato a uno dei valori di cui dovevo scoprire i numeri “speciali” da 1 a essi.
In questo modo però si perdeva l’ordine dell’array e i valori venivano stampati in ordine crescente quindi ho creato un array in cui avrei salvato questo valori. Tuttavia il problema è ora diventato “Execution killed with signal 11 (could be triggered by violating memory limits)”

Ecco il mio codice:

#include <stdio.h>
#include <assert.h>
#define MAXT 10000

int T, i,a,j,q,k;
int N[MAXT];

int main() {
FILE *fr,*fw;
fr=fopen("input.txt","r");
fw=fopen("output.txt","w");
    fscanf(fr,"%d", &T);
    for(int z=0; z<T; z++)
   fscanf(fr,"%d", &N[z]);
int AAA[T];
q=0;
for(int l=0;l<T;l++)
    {if (N[l]>q) q=N[l];}
int contatore=0;
for(i=1;i<=q;i++)
{
a=i;
k=0;
//la somma delle cifre in binario viene assegnara a k
while(a>0)
{k=k+(a%2);
    a=a/2;}
a=i;
//la somma delle cifre in base 3 viene assegnara a j
j=0;
while(a>0)
{j=j+(a%3);
    a=a/3;}
//se combaciano il contatore aumenta
if(k==j)
    contatore++;
int p;
for(p=0;p<=q;p++)
if(N[p]==i)
    AAA[p]=contatore;
}
for(int l=0;l<T;l++)
    fprintf(fw,"%d ",AAA[l]);


    return 0;
}

Ciao , io in gara ho fatto 65/100, guarda bene i constraints ! Se fai un array lungo solo 10000 non basterà nel caso in cui arriverai a calcolare numeri speciali maggiori della grandezza dell’array. se aumenti la grandezza dell’array tipo a 100000 o un 1 milione dovrebbe migliorare. Se lo fai ancora più grande non starà nei limiti di memoria imposti dal problema e purtroppo questo in gara non sono riuscito a risolverlo.

1 Mi Piace

Fammi sapere se riesci a risolverlo

ok ho fatto come mi hai consigliato ma la situazione non è migliorata poi di molto pensavo di risolvere i problemi di tempo con il mio metodo ma così non è stato. Grazie lo stesso <3

scusa, mi sa che ho malinteso quello che hai scritto. Io ho fatto così:

  • Ho creato un array a [1milione] di appoggio inizializzato tutto a 0, dove ogni indice corrisponde ad un numero ed in quella posizione inserisco per ogni numero preso in input la quantità di numeri speciali contenuti in esso.
  • Per ogni numero k:
    • Controllo se nel vettore di appoggio ‘a’ c’è una posizione minore rispetto al numero preso in input, cioè in altre parole se il mio numero è 1000 e io ho già calcolato in precedenza che un altro numero in input, mettiamo 500 aveva 300 numeri speciali (tra 1 e 500), allora non ricalcolavo da capo tutti i numeri speciali da 1 a 1000 ma bensì sommavo quelli in a[500] e calcolavo i numeri speciali da 501 a 1000 , poi aggiornando il vettore di appoggio in posizione a[1000] con i numeri speciali contati in totale.

se hai fatto cosi dovrebbe darti 65 per forza

Oggi mi è venuta in mente una cosa: mi sa che forse il vero motivo per cui non andava era per via dell input. I numeri che leggi devono essere almeno long , se no fai overflow e quindi se accedi all array di appoggio con un numero negativo ti fa un kill dell esecuzione. Quando ho tempo proverò e vedrò se darà TLE…
Non dovrebbe perché gli altri subtask erano molto veloci