Gabriele ha un nuovo rompicapo preferito, chiamato Rispetta i versi.
Si tratta di un solitario giocato su una griglia formata da N caselle separate da un simbolo di disuguaglianza; in figura è mostrato un esempio con N=6
[] < [] > [] < [] < [] > []
L’obiettivo del gioco è quello di riempire le celle vuote con tutti i numeri da 1 a N (ogni numero deve comparire esattamente una volta), in modo da rispettare le disuguaglianze tra caselle adiacenti.
Per la griglia della figura, una delle possibili soluzioni al rompicapo è la seguente:
2 < 5 > 1 < 3 < 6 > 4.
Dati di input
Il file input.txt contiene due righe di testo.
- Sulla prima è presente l’intero N, il numero di caselle del gioco.
- Sulla seconda è presente una stringa di N−1 caratteri, ognuno dei quali può essere solo < o >, che descrive i vincoli tra le caselle, da sinistra a destra.
Dati di output
Il file output.txt contiene su una sola riga una qualunque permutazione dei numeri da 1 a N – separati tra loro da uno spazio – che risolve il rompicapo.
I numeri corrispondono ai valori scritti nelle caselle, leggendo da sinistra verso destra.
Assunzioni
- 2 ≤ N ≤ 100000.
- Nel 30% dei casi, il valore di N non supera 10.
- Nel 60% dei casi, il valore di N non supera 20.
- Si garantisce l’esistenza di almeno una soluzione per ciascuno dei casi di test utilizzati nella verifica del funzionamento del programma.
Esempi di input/output
input.txt | output.txt |
6 <><<> |
2 5 1 3 6 4 |
5 >><< |
5 3 1 2 4 |
8 >><>><> |
6 5 4 7 3 2 8 1 |
/* www.valcon.it OII 2015 - Fase territoriale - Rispetta i versi */ #include#include char buffer[100001]; int main() { long N; FILE* fin =fopen( "input.txt","r"); FILE* fout=fopen("output.txt","w"); fscanf(fin, "%s", buffer); N=atol(buffer); fscanf(fin, "%s", buffer); long min=1; long max=N; for(long i=0; i < N-1; i++) { if(buffer[i] == '<') { fprintf(fout, "%ld ", min); min++; } else if(buffer[i] == '>') { fprintf(fout, "%ld ", max); max--; } } fprintf(fout, "%ld", max); return 0; }