La territoriale ha il vizio di avere un problema davvero tosto ogni anno... Qualche volta anche due, e su 3 sono tanti... Il problema "Brisbane" dell'altr'anno solo una persona l'ha risolto completamente, in tutta italia... In piemonte si passava con 24/50, ma in alcune regioni con 11/50... Cioè è un po' ridicola la cosa...xXStephXx ha scritto:il 4 non l'ho fatto in modo generico xD Ho messo solo una serie di if-else if tutti incolonnati xDD
nel 3) esatto! Bisognava esplorare il grafo ricorsivamente
Comunque sul fatto della difficoltà non saprei.... Ho pochi esempi con cui confrontare... però una volta avevo visto un paio di problemi della fase nazionale (forse quella dell'ultimo anno) e devo dire che a parte la maggior attenzione all'ottimizzazione... non erano tanto più difficili di questi xD
La differenza è che lì bisognava sforzarsi di trovare un modo veloce e qui no.
Gara di Allenamento Tor Vergata
Re: Gara di Allenamento Tor Vergata
Re: Gara di Allenamento Tor Vergata
In effetti le territoriali non le ho mai viste. Forse solo una volta nel 2011 perchè conoscevo uno che ha partecipato. Può essere che ci sia qualcuno molto difficile xD
Quello a cui mi riferivo erano un paio di problemi delle nazionali che avevo visto qualche mese fa.
In uno c'era uno spiedino dove bisognava mangiare da entrambi i lati assicurandosi di non sforare un certo valore mi pare.
Nell'altro c'era una specie di lista con le preferenze e forse si voleva accontentare un po' tutti.
In entrambi serviva una certa idea iniziale in modo da rendere le cose molto veloci e rimanere nei limiti di tempo. Però comunque erano idee "in linea" con i problemi di matematica che vediamo spesso, quindi comunque nulla di calato dal cielo.. Fatto ciò, la stesura del codice era abbastanza veloce e non c'erano ambiguità. Qua magari servivano pure meno idee, però capire cosa si doveva fare è stata una faticaccia xD
Giusto per rendere l'idea.. in quello della lista con le preferenze mi pare che si trattava di ordinarle dalla più alta alla più bassa e prendere le più alte xD
Quello a cui mi riferivo erano un paio di problemi delle nazionali che avevo visto qualche mese fa.
In uno c'era uno spiedino dove bisognava mangiare da entrambi i lati assicurandosi di non sforare un certo valore mi pare.
Nell'altro c'era una specie di lista con le preferenze e forse si voleva accontentare un po' tutti.
In entrambi serviva una certa idea iniziale in modo da rendere le cose molto veloci e rimanere nei limiti di tempo. Però comunque erano idee "in linea" con i problemi di matematica che vediamo spesso, quindi comunque nulla di calato dal cielo.. Fatto ciò, la stesura del codice era abbastanza veloce e non c'erano ambiguità. Qua magari servivano pure meno idee, però capire cosa si doveva fare è stata una faticaccia xD
Giusto per rendere l'idea.. in quello della lista con le preferenze mi pare che si trattava di ordinarle dalla più alta alla più bassa e prendere le più alte xD
Re: Gara di Allenamento Tor Vergata
Ho appena finito: 340/400 in 4 ore (o forse in 3, non lo so l'ora legale mi ha fregato) circa senza aiutini da internet e senza ritrattare le soluzioni già date al correttore, considerando che fino a 3 giorni fa i problemi più complicati che avevo mai fatto erano "verificare se un numero n è primo" o "riordinare e stampare un vettore in ordine crescente" direi che va piuttosto bene come punteggio
1) 45 minuti, boh ora ho un'idea nuova del fuorigioco ma non era difficile, anzi. 100 punti
2) 25 minuti, questo era anche più semplice del 1. 100 punti
4) un' ora e venti minuti, il problema non è stato tanto trovare l'idea ma codificarla nel modo giusto evitando di perdere punti. 100 punti
3) ho perso la cognizione del tempo, non lo so, ho provato a creare una struttura iterativa (non ho idea di come scrivere una ricorsione) con il risultato di dover creare una struttura ricorsiva a mano, ha funzionato in parte, fa un po' di controlli all'interno ma non potevo nidificare 20 iterazioni. 40 punti
1) 45 minuti, boh ora ho un'idea nuova del fuorigioco ma non era difficile, anzi. 100 punti
2) 25 minuti, questo era anche più semplice del 1. 100 punti
4) un' ora e venti minuti, il problema non è stato tanto trovare l'idea ma codificarla nel modo giusto evitando di perdere punti. 100 punti
3) ho perso la cognizione del tempo, non lo so, ho provato a creare una struttura iterativa (non ho idea di come scrivere una ricorsione) con il risultato di dover creare una struttura ricorsiva a mano, ha funzionato in parte, fa un po' di controlli all'interno ma non potevo nidificare 20 iterazioni. 40 punti
Re: Gara di Allenamento Tor Vergata
Più o meno così: (tanto non c'erano altri che devono fare no? )
dove nell'array visitati inizialmente si setta tutto su false. Quando la funzione termina si va a guardare quali elementi dell'array sono ancora settati su false e quelli lì non erano collegati al portiere.
Per richiamarla si usa dal main:
Codice: Seleziona tutto
void ric(int partenza, int escluso, bool visitati[11])
{
visitati[partenza]=true;
for(int i=0; i<11;i++)
{
if(i==partenza) continue;
if(passaggi[partenza][i] && !visitati[i] && i!=escluso) //passaggi[a][b] era l'array che salva se c'è passaggio tra a e b
ric(i, escluso, visitati);
}
}
Per richiamarla si usa dal main:
Codice: Seleziona tutto
ric(0, giocatore_escluso, array_di_11_elementi_settati_a_0);
Re: Gara di Allenamento Tor Vergata
Esattamente, non sapevo la sintassi nel caso specifico con array e funzioni ricorsive e, detto fra noi, cominciavo ad aver sonnoxXStephXx ha scritto:Codice: Seleziona tutto
void ric(int partenza, int escluso, bool visitati[11]) { visitati[partenza]=true; for(int i=0; i<11;i++) { if(i==partenza) continue; if(passaggi[partenza][i] && !visitati[i] && i!=escluso) //passaggi[a][b] era l'array che salva se c'è passaggio tra a e b ric(i, escluso, visitati); } }
Re: Gara di Allenamento Tor Vergata
Quando è finita la gara potete mettermi le vostre soluzioni?
Io ci ho provato, ma è troppo lunga e difficile (soprattutto non so bene come prendere i dati di input)...
Grazie
P.S.: meglio se in C++
Io ci ho provato, ma è troppo lunga e difficile (soprattutto non so bene come prendere i dati di input)...
Grazie
P.S.: meglio se in C++
Re: Gara di Allenamento Tor Vergata
Ti metto le mie, premettendo che sono scritte nel modo più rapido possibile, quindi male a livello sintattico e algoritmico, ma visto che alle provinciali questo non conta, basta che funzionino...Xeanort ha scritto:Quando è finita la gara potete mettermi le vostre soluzioni?
Io ci ho provato, ma è troppo lunga e difficile (soprattutto non so bene come prendere i dati di input)...
Grazie
P.S.: meglio se in C++
Es.1
Testo nascosto:
Testo nascosto:
Testo nascosto:
Testo nascosto:
Re: Gara di Allenamento Tor Vergata
Metto anche i miei che sono in C:
Fuorigioco
Capocannoniere
Fulcro del gioco
Sorteggio
Fuorigioco
Testo nascosto:
Testo nascosto:
Testo nascosto:
Testo nascosto:
Re: Gara di Allenamento Tor Vergata
E' abbastanza ottimale in questi casi Con i dovuti controlli la funzione ricorsiva viene eseguita una sola volta per ogni nodo, non si spreca niente xDmr96 ha scritto: Es.3
... Come metodo non è ottimale a livello di tempo di stesura ed esecuzione
In realtà, premetto che l'avevo usato altre volte e che comunque approcci del genere li conoscevo, anche il tempo di stesura è buono. Di solito le funzioni ricorsive fanno sempre risparmiare molte righe Il difetto è che spesso non salvano ciò che hanno già calcolato... infrangendo il motto:
Ad esempio i numeri di fibonacci calcolati col "for" impiegano un tempo lineare.... Se invece provi ad usare la funzione ricorsiva.... sì.. è bella da vedere... però passi da $O(n)$ a $O(2^n)$Livex ha scritto: "sprecare memoria per fare prima!"
Un esempio in cui conviene sprecare memoria è quello del problema "Si ha una stringa molto lunga di numeri... si vuole calcolare la massima somma ottenibile prendendone alcuni consecutivi"
Qua facendolo brutalmente viene $O(n^3)$ se invece si usa il trucchetto di salvare tutte le somme parziali cominciando dall'inizio e fermandosi in una posizione $i$ per ogni $i$ da $1$ a $n$ (dove n è la lunghezza), si può trovare il valore massimo in $O(n^2)$
PS: in realtà con un trucchetto più sofisticato i fibonacci possono essere calcolati in $O(log(n))$ una spada E forse sotto alcune condizioni anche il problema di sopra si poteva fare in $O(n)$ ma non ricordo nè quali nè come.
Re: Gara di Allenamento Tor Vergata
Sono usciti i risultati... 14 full score e la cosa brutta è che sono ordinati in base al cognome... La prossima volta sarò Marco Abdullah!
Sono uscite pure le soluzioni xD Più o meno stessi approcci tranne per il cannoniere che l'avevo fatto così:
Usando il map<int, int> che forse è un po' un cannone visto il contesto...
Mentre quello del fulcro del gioco l'avevo fatto con la ricorrenza così:
E' bella la soluzione ufficiale dove viene esplorato usando lo stack, in effetti usando anche la lista dei passaggi al posto della matrice quadrata si risparmiano pure iterate inutili del for che io uso nella funzione ricorsiva... Però forse pure lo stack<int> e le struct sono cannoni quanto il map<int,int>
Sono uscite pure le soluzioni xD Più o meno stessi approcci tranne per il cannoniere che l'avevo fatto così:
Codice: Seleziona tutto
#include <iostream>
#include <map>
#include <stdio.h>
using namespace std;
int main()
{
map<int, int> giocatori;
FILE* f = fopen("input.txt", "r");
int p;
fscanf(f, "%d", &p);
int id, reti;
for(int i=0; i<p;i++)
{
fscanf(f, "%d", &id);
fscanf(f, "%d", &reti);
giocatori[id]+=reti;
}
int max=0, max_reti=0;
for(map<int,int>::iterator it=giocatori.begin(); it!=giocatori.end(); it++)
{
if(it->second>max_reti) {max_reti=it->second; max=it->first;}
}
fclose(f);
f=fopen("output.txt", "w");
fprintf(f, "%d %d", max, max_reti);
fclose(f);
}
Usando il map<int, int> che forse è un po' un cannone visto il contesto...
Mentre quello del fulcro del gioco l'avevo fatto con la ricorrenza così:
Codice: Seleziona tutto
#include <iostream>
#include <stdio.h>
#include <list>
using namespace std;
bool passaggi[11][11];
void ric(int partenza, int escluso, bool visitati[11])
{
visitati[partenza]=true;
for(int i=0; i<11;i++)
{
if(i==partenza) continue;
if(passaggi[partenza][i] && !visitati[i] && i!=escluso)
ric(i, escluso, visitati);
}
}
int main()
{
FILE* f= fopen("input.txt", "r");
int m;
fscanf(f, "%d", &m);
int a, b;
for(int i=0; i<m;i++)
{
fscanf(f, "%d", &a);
fscanf(f, "%d", &b);
passaggi[a-1][b-1]=true;
}
fclose(f);
int max_esclusi=0, rimosso;
bool visitati[11];
for(int i=1; i<11;i++)
{
int count=0;
for(int j=0; j<11;j++)
visitati[j]=false;
visitati[0]=true;
ric(0, i, visitati);
for(int i=0; i<11;i++)
if(visitati[i]==false)count++;
if(count > max_esclusi) {max_esclusi=count; rimosso=i;}
}
f=fopen("output.txt", "w");
fprintf(f, "%d", rimosso+1);
fclose(f);
}