Buongiorno, é da ieri sera che provo a risolvere quadri con questo codice:
struct window {
int wStart;
int wEnd;
long long wSum = 0;
};
// Modifica la somma della sliding window
void calculate_sum(window& sw, int V[]) {
long long sum = 0;
for (int i = sw.wStart; i < sw.wEnd; ++i)
sum += V[i];
sw.wSum = sum;
}
// N: numero quadri, M: massimale somma sliding window, V: array di quadri
int quadri(int N, long long M, int V[]) {
if (N == 1) return (V[0] <= M); // 1 o 0
// Subtest 2
window sub2 = {0, N, 0};
calculate_sum(sub2, V);
if (M > sub2.wSum) return N;
// Controlliamo che B = 1 sia possibile, altrimenti ritorna 0
for(int i = 0; i < N; ++i)
if (V[i] > M) return 0;
// Troviamo il massimo locale per il primo window e settiamo il bound massimo, da qui puo solo scendere
int B = N;
window w = {0, 1, 0};
while (w.wSum <= M) {
w.wEnd += 1;
calculate_sum(w, V);
}
w.wEnd -= 1;
calculate_sum(w, V);
if (w.wEnd-w.wStart < B) B = w.wEnd-w.wStart;
// Ripetiamo il procedimento per ogni altra window
for(int i = 1; i < N-B+1; ++i) {
w = {i, i+B, 0};
calculate_sum(w, V);
if (w.wSum > M) B--;
}
return B;
}
Il codice mi da tutto corretto tranne il subtask 5 dove va in Execution time out. L’idea di come migliorarlo l’ho giá in mente, ovvero anziché ricalcolarmi la somma di ogni window potrei semplicemente sottrarre l’inizio della window precedente e sommare il nuovo valore di fine della window.
Il problema é che quando l’ho provato ad implementare in questo modo:
// Meccanismo di sliding window
for(int i = 1; i < N-B; ++i){
sum = sum - V[i-1] + V[i+B-1];
if (sum > M) {
B--;
sum -= V[i+B-1];
}
}
Mi vengono assegnati solo 15/100 punti perché alcuni output sono errati ed alcuni test mi dicono ‘Execution killed (could be triggered by violating memory limits)’
Grazie in anticipo per l’aiuto…