Ois_annoluce [Execution Timed Out]

Ciao a tutti, sto provando a risolvere il problema annoluce ma non riesco a ottenere 100/100 perché il programma va fuori tempo sui testcase: 6, 11, 18, 24, 25. (Risultato ottenuto 30/100)
Il codice del mio programma è questo, in pratica inizialmente memorizzo in un vettore i quadrati delle distanze di ogni pianeta (per evitare ogni volta di andare a calcolare una radice quadrata), dopo di che ordino il vettore con la funzione sort, e ogni volta che acquisisco in input una query vado a effettuare una ricerca binaria per sapere quanti pianeti posso visitare con la distanza (elevata al quadrato anch’essa) indicata. Per effettuare la ricerca binaria ho utilizzato la lower_bound, tuttavia anche in questo modo ho ottenuto un worstcase di circa 1,3s (sul testcase 24). Inoltre ho riprovato dopo un po a risottoporre al test lo stesso programma ottenendo 80/100 con worstcase di 1,032 sempre sul 24.
Ho cercato sul forum e ho visto che esistono già discussioni su questo problema, ma purtroppo i consigli che vengono forniti li avevo già applicati in precedenza sul mio programma, quindi non capisco perché non funziona (e soprattutto perché lo stesso programma mi da prima un risultato di 30/100 e poi di 80/100). Ho notato dalle statistiche del problema che alcune persone sono riuscite ad ottenere un worstcase di circa 1 decimo di secondo, quindi a questo punto mi chiedo se sto sbagliando approccio o se ho commesso qualche errore di distrazione nel codice. Grazie in anticipo per le eventuali risposte! :slight_smile:

L’idea è corretta e il codice anche, un modo per diminuire i tempi di esecuzione è usare “\n” invece di endl per andare a capo, perché endl (se non erro) fa un flush del buffer dell’output che non serve e quindi aumenta i tempi di esecuzione (specialmente se vai a capo molte volte). Il mio codice è praticamente uguale al tuo a meno di quella modifica, e il tempo peggiore è di 0,18s!

1 Mi Piace

@LordDaidalos grazie mille, ho sostituito endl con “\n” e ho ottenuto 0.22 come tempo peggiore… Non avrei mai immaginato che il problema potesse essere quello! :sweat_smile:

Esattamente, il flush è l’operazione con la quale , per esempio con output su file, i vari byte vengono passati dal buffer al file stesso, se questa operazione in quanto rimuove tutte le informazioni all’interno del buffer stesso usa “molto” tempo, soprattutto se ripetuta molte volte.

Nel caso in cui si utilizzi invece “\n” il buffer viene svuotate solamente quando esso raggiunge la dimensione massima, che nel caso un cui gli output singoli siano di un solo “carattere” verrà raggiunta dopo molto tempo e permette quindi di risparmiare molto tempo.

1 Mi Piace