Ho trovato in internet i testi dei vari esercizi che sono stati proposti alla fase regionale delle olimpiadi di informatica 2012, ecco le mie soluzioni :
GranPix
#include <iostream>
#include <fstream>
using namespace std;
void crea_partenza(ifstream &in,int n_macchine,int partenza[]){
int car;
for(int i=0;i<n_macchine;i++){
in >> car;
partenza[i]=car;
}
}
void swap(int partenza[],int n_sorpassi,int car1,int car2){
for(int i=n_sorpassi-1;i>=0;i--){
if(partenza[i]==car1){
partenza[i]=car2;
partenza[i-1]=car1;
break;
}
}
}
void sorpassi(ifstream &in,int n_sorpassi,int partenza[]){
int car1,car2;
for(int i=0;i<n_sorpassi;i++){
in >> car1; in >> car2;
swap(partenza,n_sorpassi,car1,car2);
}
}
int main(){
ifstream in("input.txt");
int n_macchine=0,n_sorpassi=0;
in >> n_macchine ; in >> n_sorpassi;
int partenza[n_macchine];
crea_partenza(in,n_macchine,partenza);
sorpassi(in,n_sorpassi,partenza);
cout << *partenza;
system("pause");
return 0;
}
#include <fstream>
using namespace std;
void crea_partenza(ifstream &in,int n_macchine,int partenza[]){
int car;
for(int i=0;i<n_macchine;i++){
in >> car;
partenza[i]=car;
}
}
void swap(int partenza[],int n_sorpassi,int car1,int car2){
for(int i=n_sorpassi-1;i>=0;i--){
if(partenza[i]==car1){
partenza[i]=car2;
partenza[i-1]=car1;
break;
}
}
}
void sorpassi(ifstream &in,int n_sorpassi,int partenza[]){
int car1,car2;
for(int i=0;i<n_sorpassi;i++){
in >> car1; in >> car2;
swap(partenza,n_sorpassi,car1,car2);
}
}
int main(){
ifstream in("input.txt");
int n_macchine=0,n_sorpassi=0;
in >> n_macchine ; in >> n_sorpassi;
int partenza[n_macchine];
crea_partenza(in,n_macchine,partenza);
sorpassi(in,n_sorpassi,partenza);
cout << *partenza;
system("pause");
return 0;
}
Turni
#include <iostream>
#include <fstream>
using namespace std;
struct Periodo {
int g_inizio,g_fine;
};
void carica_disponibili(ifstream &in,Periodo disponibili[],int persone){
int g_p,g_f;
for(int i=0;i<persone;i++){
in >> g_p; in >> g_f;
disponibili[i].g_inizio=g_p;disponibili[i].g_fine=g_f;
}
}
int analizza(Periodo disponibili[],int persone,int giorni){
int giorno_attuale=0;
int cnt=0;
while(giorno_attuale<giorni-1){
for(int i=0;i<persone;i++){
if((disponibili[i].g_inizio==giorno_attuale) || (disponibili[i].g_inizio< giorno_attuale && disponibili[i].g_fine>giorno_attuale)){
giorno_attuale=disponibili[i].g_fine+1;
cnt++;
break;
}
}
}
return cnt;
}
int main(){
int giorni,persone;
ifstream in("input.txt");
in >> giorni; in >> persone;
Periodo disponibili[persone];
carica_disponibili(in,disponibili,persone);
cout << analizza(disponibili,persone,giorni);
system("pause");
return 0;
}
#include <fstream>
using namespace std;
struct Periodo {
int g_inizio,g_fine;
};
void carica_disponibili(ifstream &in,Periodo disponibili[],int persone){
int g_p,g_f;
for(int i=0;i<persone;i++){
in >> g_p; in >> g_f;
disponibili[i].g_inizio=g_p;disponibili[i].g_fine=g_f;
}
}
int analizza(Periodo disponibili[],int persone,int giorni){
int giorno_attuale=0;
int cnt=0;
while(giorno_attuale<giorni-1){
for(int i=0;i<persone;i++){
if((disponibili[i].g_inizio==giorno_attuale) || (disponibili[i].g_inizio< giorno_attuale && disponibili[i].g_fine>giorno_attuale)){
giorno_attuale=disponibili[i].g_fine+1;
cnt++;
break;
}
}
}
return cnt;
}
int main(){
int giorni,persone;
ifstream in("input.txt");
in >> giorni; in >> persone;
Periodo disponibili[persone];
carica_disponibili(in,disponibili,persone);
cout << analizza(disponibili,persone,giorni);
system("pause");
return 0;
}
Barbablu
#include <iostream>
#include <fstream>
using namespace std;
void matrice_di_adiacenza(ifstream &in,int *grafo[],int n_cabine){
for(int i=0;i<n_cabine;i++)
for(int j=0;j<n_cabine;j++)
grafo[i][j]=0;
int s1,s2,l;
while(in){
in >> s1; in >> s2; in >> l;
grafo[s1-1][s2-1]=l;
grafo[s2-1][s1-1]=l;
}
}
int trova_il_tesoro(int *grafo[],int n_cabine,int stanza_tesoro,int sacche[],int n_sacche){
int stanza_attuale=0;
int distanza=0;
int aria=20;
bool visitata[n_cabine]; for(int i=0;i<n_cabine;i++) visitata[i]=false;
while(stanza_attuale!=stanza_tesoro){
bool fine=true;
for(int i=0;i<n_cabine;i++)
fine=fine & visitata[i];
if(fine)
return -1; // se ho visitato tutte le stanze
bool modifica=false;
for(int i=0;i<n_cabine;i++){
for(int j=0;j<n_cabine;j++)
if(i==stanza_attuale && grafo[i][j]!=0 && aria-grafo[i][j]>0 && !visitata[j] ){
visitata[stanza_attuale]=true;
distanza+=grafo[i][j];
stanza_attuale=j;
aria-=grafo[i][j];
modifica=true;
break;
}else if(j==stanza_attuale && grafo[j][i]!=0 && aria-grafo[j][i]>0 && !visitata[i] ){
visitata[stanza_attuale]=true;
distanza+=grafo[j][i];
stanza_attuale=i;
aria-=grafo[j][i];
modifica=true;
break;
}
if(modifica)
break;
}
if(!modifica) // se non riesco a spostarmi in nessun altra stanza
return -1;
for(int i=0;i<n_sacche;i++)
if(sacche[i]==stanza_attuale){
aria=20; // se nella stanza c è aria ricarico
break;
}
}
return distanza;
}
int main(){
int n_cabine,n_corridoi,tesoro,n_sacche;
ifstream in("input.txt");
in >> n_cabine; in >> n_corridoi; in >> tesoro; in >> n_sacche;
int pos_sacche[n_sacche];
for(int i=0;i<n_sacche;i++)
in >> pos_sacche[i],pos_sacche[i]--;;
int **grafo;
grafo=new int*[n_cabine];
for(int i=0;i<n_cabine;i++)
grafo[i]=new int[n_cabine];
matrice_di_adiacenza(in,grafo,n_cabine);
cout << trova_il_tesoro(grafo,n_cabine,tesoro-1,pos_sacche,n_sacche);
system("pause");
return 0;
}
#include <fstream>
using namespace std;
void matrice_di_adiacenza(ifstream &in,int *grafo[],int n_cabine){
for(int i=0;i<n_cabine;i++)
for(int j=0;j<n_cabine;j++)
grafo[i][j]=0;
int s1,s2,l;
while(in){
in >> s1; in >> s2; in >> l;
grafo[s1-1][s2-1]=l;
grafo[s2-1][s1-1]=l;
}
}
int trova_il_tesoro(int *grafo[],int n_cabine,int stanza_tesoro,int sacche[],int n_sacche){
int stanza_attuale=0;
int distanza=0;
int aria=20;
bool visitata[n_cabine]; for(int i=0;i<n_cabine;i++) visitata[i]=false;
while(stanza_attuale!=stanza_tesoro){
bool fine=true;
for(int i=0;i<n_cabine;i++)
fine=fine & visitata[i];
if(fine)
return -1; // se ho visitato tutte le stanze
bool modifica=false;
for(int i=0;i<n_cabine;i++){
for(int j=0;j<n_cabine;j++)
if(i==stanza_attuale && grafo[i][j]!=0 && aria-grafo[i][j]>0 && !visitata[j] ){
visitata[stanza_attuale]=true;
distanza+=grafo[i][j];
stanza_attuale=j;
aria-=grafo[i][j];
modifica=true;
break;
}else if(j==stanza_attuale && grafo[j][i]!=0 && aria-grafo[j][i]>0 && !visitata[i] ){
visitata[stanza_attuale]=true;
distanza+=grafo[j][i];
stanza_attuale=i;
aria-=grafo[j][i];
modifica=true;
break;
}
if(modifica)
break;
}
if(!modifica) // se non riesco a spostarmi in nessun altra stanza
return -1;
for(int i=0;i<n_sacche;i++)
if(sacche[i]==stanza_attuale){
aria=20; // se nella stanza c è aria ricarico
break;
}
}
return distanza;
}
int main(){
int n_cabine,n_corridoi,tesoro,n_sacche;
ifstream in("input.txt");
in >> n_cabine; in >> n_corridoi; in >> tesoro; in >> n_sacche;
int pos_sacche[n_sacche];
for(int i=0;i<n_sacche;i++)
in >> pos_sacche[i],pos_sacche[i]--;;
int **grafo;
grafo=new int*[n_cabine];
for(int i=0;i<n_cabine;i++)
grafo[i]=new int[n_cabine];
matrice_di_adiacenza(in,grafo,n_cabine);
cout << trova_il_tesoro(grafo,n_cabine,tesoro-1,pos_sacche,n_sacche);
system("pause");
return 0;
}
E ovviamente i testi degli esercizi : DOWNLOAD
