enunciado Torneo Chuck Norris

3 views
Skip to first unread message

Mario Storti

unread,
Mar 22, 2013, 11:00:28 AM3/22/13
to torneo-...@googlegroups.com
COUNTSETS: CONTAR CONJUNTOS DIFERENTES
======================================

El problema consiste en determinar de una serie de N conjuntos de
enteros de tamaño variable S_j, cuántos de ellos son
diferentes. Los conjuntos vienen concatenados en un vector<int> v,
viniendo los elementos de cada conjuntos separados por un entero
-1. Por ejemplo si v=[3,2,1,-1,5,4,-1,3,2-1,4,5,-1] entonces los conjuntos
son S0={1,2,3}, S1={4,5}, S2={2,3}, S3={4,5}. En este caso el programa
debe retornar 3, ya que S1 y S3 son el mismo conjunto. La función a
escribir es int count_sets(const vector<int> &v);.

Como caso test, si tenemos

S0={4 }
S1={4 3 }
S2={8 2 3 4 7 }
S3={8 }
S4={6 1 9 4 7 }
S5={5 7 }
S6={8 7 4 9 }
S7={6 1 7 3 }
S8={3 7 9 }
S9={4 }
S10={7 8 1 9 }
S11={5 2 6 8 }
S12={3 6 1 7 }
S13={6 9 5 0 }
S14={8 0 }
S15={3 4 9 7 2 5 }
S16={5 4 }
S17={2 5 1 }
S18={5 0 7 }
S19={5 9 0 8 }

Entonces la función debe devolver 18, ya que de los 20 conjuntos dos
de ellos están repetidos (S9=S0 y S7=S12). (Este caso se puede generar
en el programa poniendo el juego de parámetros que está indicado como
"CASO DE PRUEBA".)

NOTAS:
. Los valores de los conjuntos están en el rango [0,RAND_MAX)

. El número de conjuntos es N=1000000, los conjuntos tienen un número
aleatorio de elementos de entre 1 y 5.

. Los elementos de los conjuntos están desordenados dentro del
vector.

. La función es llamada ntimes=40 veces (esto es sólo a efectos de
poder medir con mayor precisión el tiempo de ejecución) sobre 40
vectores distintos. Por lo tanto el programa imprime 40 números por
stdout. Concretamente los primeros 4 enteros son:

909549
909677
909488
909632

. Los datos están generados de manera que aproximadamente un 10% de
los conjuntos están repetidos. Es decir que los conteos de conjuntos
diferentes están cerca de 900000.

. Se provee un archivo template `countset.cpp' que implementa una
solución básica usando set<set<int>>. Está solución tarda unos 2.5min en
un i7-2630 @ 2.00GHz.

. Por si les sirve al llamar al compilador estamos agregando una
bandera DOMJUDGE, es decir (g++ -DDOMJUDGE...) de manera que en el
código pueden usar

#ifdef DOMJUDGE
// Aca seguro que estoy corriendo en el
// servidor DOMjudge del torneo...
#endif

para no tener que andar comentando código cada vez que hacen una
submisión.


--
-------------------------
Mario Alberto Storti [cel. +54-342-5122135]
CIMEC (INTEC/CONICET-UNL)
Predio CONICET-Santa Fe
Colect. Ruta Nac. 168 Km 472, Paraje El Pozo
3000 Santa Fe, Argentina
Tel: +54-342-4511594 (ext 1015), Tel/Fax: +54-342-4511169
Home: +54-342-4550193, e-mail: mario.storti at gmail.com
http://www.cimec.org.ar/mstorti
-------------------------
countset.cpp
Reply all
Reply to author
Forward
0 new messages