Algobadge
work in progress!
Qui puoi trovare hint per i problemi di Algobadge!
Algobadge è un raccolta di problemi divisi per argomento il cui completamento serve, ad esempio, per fare gli stage o partecipare alle nazionali.
E' un ottimo modo per esercitarsi negli argomenti imparati.
Intro
Tutti i problemi di categoria servono per allenarsi a scrivere in c++. Per questo non dovrebbero servire hint, se avete bug che non capite come risolvere chiedete pure a noi!
Lib
I problemi in questa categoria richiedono di conoscere l'stl.
Cestini
Hint:
Usa un vettore di vettori.
Catalogo
Hint 1:
Vogliamo tenerci per ogni id il numero di libri con quell'id.
Hint 2:
Usa una map.
Autogrill
Hint 1:
Vogliamo tenerci valori diversi tra loro e ci interessa vedere l'elemento più vicino ad un certo valore. Se solo ci fosse una struttura dati con una funzione simile....
Hint 2:
Usa un set con lower_bound (attento a come usare lower_bound).
Greedy
Tutti questi problemi si risolvono con tecniche greedy, quindi facendo scelte in modo avido, basandosi su un solo criterio. Potrebbe servire anche una binary search 😉
Collezionismo
Hint 1:
Intuitivamente come mettiamo i modellini sugli scaffali? Spoiler: in ordine crescente di C[i] (o decrescente).
Hint 2:
Se non ci fossero scaffali D sarebbe la somma delle differenze tra elementi consecutivi (se sono sortati).
Hint 3:
Aggiungendo uno scaffale come diminuisce la somma dei D[j]?
Hint 4:
Sorta le differenze tra elementi consecutivi.
Truffa
Hint 1:
Il criterio greedy dovrebbe essere chiaro, semplicemente sorto V.
Hint 3:
Se la complessità non torna, evita ad esempio di ricalcolare la somma o risortare ogni volta.
Quadri
Hint 1:
Calcolare B direttamente non è così facile. Però il fatto che ci chieda il B massimale e il fatto che i B che funzionano sono distribuiti in un modo ben preciso potrebbe darci un'idea.
Hint 2:
Binary search su B
Hint 3:
Come facciamo a controllare che un certo B funzioni? Spoiler: sliding window
Rec
Questa categoria richiede di sapere cos'è la ricorsione e l'induzione, cioè risolvere un problema a partire da versioni più piccole del problema stesso.
Antivirus
Non so cosa ci faccia questo problema in questa categoria.
Hint 1:
Le lunghezze delle stringhe sono tutte molto piccole, e abbiamo tanto tempo perché è un problema terry quindi possiamo sostanzialmente fare qualsiasi cosa.
Hint 2:
Potrebbe essere utile usare sapere che esiste stringa.substr(inizio, lunghezza) che ritorna una sottostringa e stringa.find(sottostringa) che trova l'indice in cui si trova una sottostringa all'interno di una stringa (se non c'è ritorna -1).
Ctf
Hint 1:
Prova a fare casi piccoli e trovare una formula.
Cabala
Hint 1:
N è molto piccolo.
Hint 2:
Posso semplicemente controllare tutti i numeri dell cabala e trovare quello con il massimo resto modulo M.
Hint 3:
Per farlo usiamo il backtracking tenendoci il numero che abbiamo fino ad adesso e procedere per ricorsione aggiungendo 3, 6 o 9 controllando che sia diversa dalla scorsa cifra.
Math
Questa categoria richiede conoscenze generiche di matematica e fastexp.
Caramelle
Hint 1:
La risposta è semplicemente l'mcm dei V[i].
Hint 2:
Si può calcolare l'mcm sapendo che mcm(a, b)*mcd(a, b) = a*b. Per calcolare l'mcd si può scrivere l'algoritmo di euclide o usare gcd(a, b).
Rsa
Hint 1:
Il problema chiede sostanzialmente di calcolare velocemente delle potenze, e questo si può fare con fastexp
Scrigni
Hint 1:
Fai conti o fai casi piccoli e viene una formula chiusa. Se non sai come leggi i prossimi hint.
Hint 2:
Se ci sono
Hint 3:
In media quante scosse prendo per indovinare il prossimo scrigno se ne ho già indovinati
Hint 4:
Se non sei riuscito a fare il calcolo dell'hint prima, prova a sommare per ogni
Hint 5:
Dovrebbe venire qualcosa del genere:
Hint 6:
Adesso se chiamiamo
Hint 7:
Se non ti è chiaro come trasformare tutto questo in un'unica formula chiusa ricordati che la somma dei numeri da 1 a
Grafi
Questa categoria richiede di conoscere la teoria sui grafi e la dsu.
Interruttori
Hint 1
Per riuscire a spegnere tutte le lampadine è necessario arrivare a un interruttore di tipo 1, quindi...
Hint 2
...quindi vogliamo trovare il nodo che massimizza il minimo delle distanze da un interruttore di tipo 1.
Hint 3
Visto che il grafo non è pesato basta fare una BFS a più sorgenti partendo dalle lampadine spente dagli interruttori di tipo 1 e vedere la lampadina con distanza maggiore. (per fare una bfs a più sorgenti basta aggiungere alla queue tutti i nodi da cui vogliamo partire e eseguire il classico algoritmo)
Connessioni
Hint 1:
Implementa una dsu
Mincammino2
Hint 1:
Implementa dijkstra
Ds
Questa categoria richiede di conoscere il concetto di prefix sum e strutture dati come il segment tree.
Calcio
Hint 1:
Posso provare tutti i possibili campi da calcio.
Hint 2:
ISe solo potessi generalizzare la prefix sum a più dimensioni...
Hint 3:
Usa una prefix sum 2d.
Museo
Hint 1:
Implementa un segment tree.
Paletta
Hint 1:
Come faccio a controllare se posso sortare una data lista?
Hint 2:
Forse la parità degli indici si comporta in modo interessante...
Hint 3:
Come faccio a contare il numero di passaggi richiesti?
Hint 4:
Il problema si riconduce a contare il numero di inversioni in un array. Posso farlo con un segment tree?
