Ciao a tutti!
Riguardo al problema “Spreco di energia” delle OIS di quest’anno, ho visto tra i tag “math”, solo che non riesco proprio a trovare un modo per risolverlo attraverso qualche “regola matematica” o attraverso un algoritmo efficiente per l’ultimo subtask. Qualcuno potrebbe darmi qualche indizio riguardo a questo problema?
Il ragionamento chiave che mi ha permesso di risolverlo è stato questo: fai finta che gli zeri all’inizio vengano contati.
Se l’input fosse n=12, invece di contare lo spreco di energia di questa sequenza:
0
1
2
3
4
5
6
7
8
9
10
11
12
calcola quello di quest’altra sequenza:
00
01
02
03
04
05
06
07
08
09
10
11
12
Questo problema “diverso” è più semplice da risolvere (o almeno così mi è sembrato). Dopodiché devi trovare il modo di aggiustare questo valore e farlo diventare il valore giusto (che sarà minore, chiaramente).
Ho provato a pensare ad un modo per risolvere il problema contando gli zeri, ma non mi viene in mente proprio nulla… A me sembrano uguali i due problemi
Mmm ulteriore indizio: per risolvere il “secondo” problema, considera separatamente le unità, le decine, le centinaia e così via magari per capire meglio prova una cosa tipo n = 123 invece di n = 12.
Non sono ancora riuscito a pensare ad un modo per risolverlo Usi per caso una variabile che rappresenta la somma delle energie da 0 a 9?
Di preciso non ricordo se usavo una tale variabile, dovrei andare a rileggermi il codice, comunque ad occhio direi che sei sulla buona strada. Infatti, la somma delle energie da 0 a 9 è una costante, e quando consideri solo la “colonna” delle unità non devi far altro che moltiplicare tale costante per un certo numero, ed eventualmente sommarci una somma parziale da 0 a 9, nel caso in cui n vale 12 tale somma parziale sarà 0+1+2.
In particolare: il numero da moltiplicare per la costante sarà il risultato della divisione intera di n per 10, mentre per sapere la somma parziale dovresti usare il resto della divisione, che si fa con l’operatore modulo.
Ho seguito lo stesso tuo ragionamento e infatti per i casi d’esempio e alcuni altri funziona, ma ci sono dei casi nei subtask 2, 3 e 4 in cui l’output non è corretto. C’è qualche caso limite?
Questo è un ottimo caso in cui si può usare il cross checking per trovare i casi limite
- Imposta n = 0
- Esegui sia la soluzione lenta che quella veloce, memorizzandoti gli output di ciascuna
- Confronta i due output, se sono diversi stop, altrimenti incrementa n e torna al punto 2
A questo punto n è il tuo caso limite
P.S. per fare cross checking può essere molto comodo imparare qualcosina di bash, in modo da non dover modificare nulla nelle due soluzioni