Volta.guideVolta.guide
Home
Introduzione
Materiale
Risorse
Algobadge
Home
Introduzione
Materiale
Risorse
Algobadge
  • Algobadge

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.

Hint 2:

https://en.wikipedia.org/wiki/Josephus_problem

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 k scrigni tra cui scegliere qual'è la probabilità di beccare subito quello giusto?

Hint 3:

In media quante scosse prendo per indovinare il prossimo scrigno se ne ho già indovinati n−k?

Hint 4:

Se non sei riuscito a fare il calcolo dell'hint prima, prova a sommare per ogni 0≤i≤k−1 la probabilità di ricevere i scosse per i.

Hint 5:

Dovrebbe venire qualcosa del genere: 1k⋅0+k−1k1k−1⋅1+k−1kk−2k−11k−2⋅2⋯=0k+1k+2k…

Hint 6:

Adesso se chiamiamo fk il numero medio di scosse avendo indovinato n−k scrigni la risposta al problema sarà: fn+fn−1+⋯+f1

Hint 7:

Se non ti è chiaro come trasformare tutto questo in un'unica formula chiusa ricordati che la somma dei numeri da 1 a n è n(n+1)2.

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?

Last Updated:
Contributors: nik-din, Giovanni