Ciao, qualcuno mi potrebbe dare un suggerimento? Immagino che l’algoritmo che ho trovato (il più semplice?) non sia abbastanza efficiente.
int quadri(int N, long long M, int V[]) {
int B = 1;
while(true){
long long sum = 0;
for(int i = 0; i < B; ++i){
sum += V[i];
}
for(int i = 0; i < N - B; ++i){
sum -= V[i];
sum += V[i + B];
if(sum > M){
return --B;
}
}
++B;
}
return -1;
}
Prima di tutto ci sono degli errori, cioè che qualora M fosse maggiore della somma dei valori dei quadri la funzione ripeterebbe il loop all’infinito senza mai ritornare un valore, per evitare questo basta mettere dei limiti a B, come while(B <= N)
Inoltre non controlli se la somma dei primi B elementi sia maggiore di M, fai il controllo solo per i sottoinsiemi successivi e nel caso in cui nessuna sottosequenza fosse maggiore di M dovresti restituire N, non - 1.
In secondo luogo, la tua soluzione è in O(N^2), mentre per rientrare nel tempo limite del problema è necessaria una soluzione al più in O(NlogN).
Se ti interessa, ci sono soluzioni sia in O(NlogN) che in O(N), le lascio in spoiler qui sotto. O(NlogN):Binary Search O(N):Sliding Window