/* Car Parking (IOI 2000) Copyright (C) 2000 Paolo Boldi and Sebastiano Vigna This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA Per capire come funziona questo programma, e` necessario prima leggere la dispensa sulle permutazioni che trovate su http://ioi.dsi.unimi.it/. Il programma calcola la permutazione necessaria a rimettere a posto le auto tramite la qsort() (secondo gli organizzatori un algoritmo come il quicksort e` troppo lento, e bisognerebbe ricorrere al distribution counting, ma in realta` la chiamata di libreria e` cosi` ottimizzata da rientrare nei parametri; potete comunque provare a implementare un distribution counting e vedere la differenza). Poi emettiamo la permutazione sotto forma di cicli di lunghezza W in maniera greedy (cioe` emettendo ogni volta quanto possibile). Dato che ogni spezzamento richiede l'aggiunta di una lettera, otteniamo esattamente il risultato richiesto. Dato che e` impossibile stabilire a priori quanti blocchi verranno emessi in output, facciamo due passate. */ #include #include #include #include #include #define min(a,b) ((a)<(b)?(a):(b)) #define MAXN 20000 /* Massimo numero di automobili */ #define MAXM 50 /* Massimo numero di tipi */ #define MAXW 50 /* Massimo numero di parcheggiatori */ int N, M, W; int perm[MAXN]; /* Vettore che rappresenta la permutazione da emettere */ int temp[MAXN]; /* Vettore temporaneo per la permutazione inversa */ char tipo[MAXN]; /* Tipo di ogni macchina */ int coppia[MAXW][2]; /* Per ogni lavoratore, la coppia da utilizzare */ char usato[MAXN]; /* Booleano che ricorda se un posto e` stato gia` sistemato */ FILE *F; /* Funzione di confronto per qsort(). La risposta e` in base al tipo. */ int comp(const void *a, const void *b) { return tipo[*(int *)a] - tipo[*(int *)b]; } int ultimavolta, /* Se e` vero stiamo facendo la seconda passata per l'output */ totale; /* Numero di blocchi */ /* Questa funzione stampa le prime l coppie nella matrice coppia[][] se ultimavolta e` vero, altrimenti incrementa totale. */ void stampacoppie(int l) { int i; if (!ultimavolta) { ++totale; return; } fprintf(F, "%d", l); for(i=0; i