Soluzioni fase regionale olimpiadi di informatica 2012

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;  
}

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;  
}

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;  
}

E ovviamente i testi degli esercizi : DOWNLOAD

Be Sociable, Share!