37b43fbd798efa54ebb5bbb7458b78e2f43c4016
resources/2018_Territoriali_soluzioni.md
... | ... | @@ -29,7 +29,7 @@ int main() { |
29 | 29 | |
30 | 30 | Anche qui, una volta estratto il problema dalla "storiella", ciò che ci viene richiesto è esprimibile in termini primitivi (variabili e array). In particolare, ci vengono fornite delle variabili (numeri interi) e 4 stringhe (array di caratteri). Vogliamo calcolare 4 indici (numeri interi) che rappresentano il "punto di partenza" del virus in ciascuna stringa. |
31 | 31 | |
32 | -Una possibile soluzione è scrivere 5 cicli for nidificati (ovvero: uno dentro l'altro, come una [matrioska](https://it.wikipedia.org/wiki/Matrioska). I 4 cicli più esterni faranno riferimento all'indice delle 4 stringhe (non è importante l'ordine). Per esempio, possiamo chiamare gli indici `i`, `j`, `k`, `l`. Il quinto ciclo, quello più interno, servirà invece a verificare che il virus sia effettivamente presente nelle posizioni indicate dai quattro indici. Per esempio, potremmo chiamare `m` l'indice di questo ciclo. |
|
32 | +Una possibile soluzione è scrivere 5 cicli for nidificati (ovvero: uno dentro l'altro, come una [matrioska](https://it.wikipedia.org/wiki/Matrioska). I 4 cicli più esterni faranno riferimento all'indice delle 4 stringhe (non è importante l'ordine). Per esempio, possiamo chiamare gli indici $i$, $j$, $k$, $l$. Il quinto ciclo, quello più interno, servirà invece a verificare che il virus sia effettivamente presente nelle posizioni indicate dai quattro indici. Per esempio, potremmo chiamare $m$ l'indice di questo ciclo. |
|
33 | 33 | |
34 | 34 | Il codice che segue implementa la soluzione appena descritta (con un `+ M` nella condizione dei cicli for, per evitare che i vari indici "fuoriescano" dalle stringhe). |
35 | 35 | |
... | ... | @@ -45,20 +45,20 @@ void solve(int t) { |
45 | 45 | cin >> F1 >> F2 >> F3 >> F4; |
46 | 46 | |
47 | 47 | for (int i = 0; i + M <= N1; i++) |
48 | - for (int j = 0; j + M <= N2; j++) |
|
49 | - for (int k = 0; k + M <= N3; k++) |
|
50 | - for (int l = 0; l + M <= N4; l++) { |
|
51 | - bool match = true; |
|
52 | - |
|
53 | - for (int m = 0; m < M; m++) |
|
54 | - if (F1[i + m] != F2[j + m] || F2[j + m] != F3[k + m] || F3[k + m] != F4[l + m]) |
|
55 | - match = false; |
|
56 | - |
|
57 | - if (match) { |
|
58 | - cout << "Case #" << t << ": " << i << " " << j << " " << k << " " << l << endl; |
|
59 | - return; |
|
60 | - } |
|
61 | - } |
|
48 | + for (int j = 0; j + M <= N2; j++) |
|
49 | + for (int k = 0; k + M <= N3; k++) |
|
50 | + for (int l = 0; l + M <= N4; l++) { |
|
51 | + bool match = true; |
|
52 | + |
|
53 | + for (int m = 0; m < M; m++) |
|
54 | + if (F1[i + m] != F2[j + m] || F2[j + m] != F3[k + m] || F3[k + m] != F4[l + m]) |
|
55 | + match = false; |
|
56 | + |
|
57 | + if (match) { |
|
58 | + cout << "Case #" << t << ": " << i << " " << j << " " << k << " " << l << endl; |
|
59 | + return; |
|
60 | + } |
|
61 | + } |
|
62 | 62 | } |
63 | 63 | |
64 | 64 | int main() { |
... | ... | @@ -71,9 +71,9 @@ int main() { |
71 | 71 | } |
72 | 72 | ``` |
73 | 73 | |
74 | -**ATTENZIONE!** Questa soluzione, sebbene sia sufficiente a prendere tutti i punti, non è quella asintoticamente ottimale. Infatti, la [complessità computazionale](https://it.wikipedia.org/wiki/Teoria_della_complessit%C3%A0_computazionale) di questa soluzione, quando la esprimiamo come funzione della lunghezza massima `N` delle quattro stringhe e della lunghezza massima `M` del virus, diventa pari a: $O(N^4M)$. |
|
74 | +**ATTENZIONE!** Questa soluzione, sebbene sia sufficiente a prendere tutti i punti, non è quella asintoticamente ottimale. Infatti, la [complessità computazionale](https://it.wikipedia.org/wiki/Teoria_della_complessit%C3%A0_computazionale) di questa soluzione, quando la esprimiamo come funzione della lunghezza massima $N$ delle quattro stringhe e della lunghezza massima $M$ del virus, diventa pari a: $O(N^4M)$. |
|
75 | 75 | |
76 | -Dato che i valori massimi di `N` e `M` sono piuttosto bassi, il nostro programma terminerà la sua esecuzione in un tempo ragionevole. Tuttavia, se questo stesso problema fosse stato proposto alla *finale nazionale*, i valori sarebbero sicuramente stati molto più elevati. Esistono infatti soluzioni asintoticamente molto più efficienti di quella appena descritta! |
|
76 | +Dato che i valori massimi di $N$ e $M$ sono piuttosto bassi, il nostro programma terminerà la sua esecuzione in un tempo ragionevole. Tuttavia, se questo stesso problema fosse stato proposto alla *finale nazionale*, i valori sarebbero sicuramente stati molto più elevati. Esistono infatti soluzioni asintoticamente molto più efficienti di quella appena descritta! |
|
77 | 77 | |
78 | 78 | ### Radioanalisi fossile (`xray`) - medio |
79 | 79 |