17/05/13 12:15
Phi
Si possono usare C, C++ e Pascal sicuramente, poi forse anche altri.
Se posti il codice che hai scritto tu possiamo capire meglio qual è il problema.
Comunque dato che N può essere 1'000'000 dovresti scrivere un algoritmo lineare.
Controlla che il tuo lo sia.
Dovresti cercare di "controllare" un numero solo un numero costante di volte.
Ultima modifica effettuata da Phi 17/05/13 12:18
aaa
19/05/13 10:39
Phi
Considera la complessità del tuo algoritmo ed il massimo valore di N.
I tuoi 2 cicli for e while richiedono circa N^2 operazione.
Dato che N massimo e 1'000'000 il computer richiederà molto più di 1 secondo per farle.
Devi cercare di scrivere(ed è possibile) un algoritmo che abbia complessità O(n).
aaa
19/05/13 14:05
Phi
Intanto io considererei a parte il caso in cui il numero antipatico sia 0.
Il questo caso basta che per ogni gruppo di 0 consecutivi aggiungi alla soluzione finale in quanti modi puoi scegliere degli zeri consecutivi. Se per esempio ai 5 zeri consecutivi dei aggiungere 5*6/2=15 alla soluzione.
Se il numero antipatico non è zero io comincerei a leggere l'array che tu hai chiamato v[], tenendo 3 varabili inizio, fine e somma. somma conterrà la somma dei numeri fra v[inizio] e v[fine], continuo ad aumentare fine alzando somma finché questa non superà o eguaglia M. Se M viene eguagliato allora aumento S, altrimenti comincio ad aumentare inizio ed a diminuire somma finché questa non è minore o eguaglia M. E così via. Così vedi ogni elemento di v[] poche volte(2 o 3).
Attento però non che quando M viene eguagliato non devi aumentare S di 1, ma devi tenere conto di eventuali zeri che circondato il tratto che hai scoperto avere somma M. Quindi devi contare anche gli zeri che precedono(chiamati zp) e seguono(chiamati zs) ed aggiungere ad s (zp+1)(zs+1).
aaa