|
Neo444
Visitante
|
 |
« : Abril 19, 2011, 08:41:44 » |
|
Hace poco que me enteré de la existencia de esto y estoy haciendo los desafÃos. Como ya he visto códigos publicados en este foro supongo que noh abrá problema. Estoy ahora con el desafÃo "esporas" Esporas Depredadoras. Tengo un código que funciona perfectamente cumpliendo el enunciado, pero el juez me dice que "Tiempo de CPU superado". La verdad no es un código muy complicado, en mi ordenador (no muy bueno), no tarda nada de tiempo en resolver en montón de casos y no se me ocurre ninguna manera de optimizar el código mucho más. A ver si se os ocurre algo, porque a mi ya no: #include <iostream> #include <vector> using namespace std;
int get_Index(vector<char>, char, int);
class Cas { private: public: char tipo; int radio; char nextTipo; };
int main() { string plantas, vacio; int pasos = 0; int num_a, m, n, i, j, k, terminado = 0; while (!terminado) { getline (cin, plantas); if (plantas.size() == 0) return 0; int num_plantas = plantas.size(); vector<char> letras(num_plantas); for (i=0;i<num_plantas;i++) { letras[i] = plantas[i]; } vector<int> radios(num_plantas); for (i=0;i<num_plantas;i++) { cin >> radios[i]; } getline(cin,vacio); cin >> m; cin >> n; getline(cin,vacio); Cas **cells = new Cas*[m]; for (i=0;i<m;i++) { cells[i] = new Cas[n]; } for (i=0;i<m;i++) { for (j=0;j<n;j++) { cin >> cells[i][j].tipo; cells[i][j].nextTipo = cells[i][j].tipo; if (cells[i][j].tipo != '*') { cells[i][j].radio = radios[get_Index(letras, cells[i][j].tipo, num_plantas)]; } else cells[i][j].radio = 0; } getline(cin,vacio); } cin >> num_a; getline(cin,vacio); getline(cin,vacio); // Aquà está listo para leer el siguiente bloque del juego de casos. for (k=0;k< num_a;k++) { for (i=0;i<m;i++) { for (j=0;j<n;j++) { if (cells[i][j].tipo != '*') { int rad = cells[i][j].radio; //Arriba if (j-rad >= 0) { if (cells[i][j-rad].tipo == '*') { cells[i][j-rad].nextTipo = cells[i][j].tipo; cells[i][j-rad].radio = rad; } else { if (cells[i][j].tipo < cells[i][j-rad].tipo) { cells[i][j-rad].nextTipo = cells[i][j].tipo; cells[i][j-rad].radio = rad; } } } //Izquierda if (i-rad >= 0) { if (cells[i-rad][j].tipo == '*') { cells[i-rad][j].nextTipo = cells[i][j].tipo; cells[i-rad][j].radio = rad; } else { if (cells[i][j].tipo < cells[i-rad][j].tipo) { cells[i-rad][j].nextTipo = cells[i][j].tipo; cells[i-rad][j].radio = rad; } } } //Abajo if (j+rad < n) { if (cells[i][j+rad].tipo == '*') { cells[i][j+rad].nextTipo = cells[i][j].tipo; cells[i][j+rad].radio = rad; } else { if (cells[i][j].tipo < cells[i][j+rad].tipo) { cells[i][j+rad].nextTipo = cells[i][j].tipo; cells[i][j+rad].radio = rad; } } } //Derecha if (i+rad < m) { if (cells[i+rad][j].tipo == '*') { cells[i+rad][j].nextTipo = cells[i][j].tipo; cells[i+rad][j].radio = rad; } else { if (cells[i][j].tipo < cells[i+rad][j].tipo) { cells[i+rad][j].nextTipo = cells[i][j].tipo; cells[i+rad][j].radio = rad; } } } } } } for (i=0;i<m;i++) { for (j=0;j<n;j++) { if (cells[i][j].tipo != cells[i][j].nextTipo) { cells[i][j].tipo = cells[i][j].nextTipo; } } } } //Imprimir matriz final if (pasos != 0) cout << endl; for (i=0;i<m;i++) { for (j=0;j<n;j++) { cout << cells[i][j].tipo; } cout << endl; } pasos++; } return 0; }
int get_Index(vector<char> array, char letra, int max) { int i = 0; for (i=0;i<max;i++) { if (array[i] == letra) { return i; } } return -1; } Os dejo el enunciado:
|
|
|
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #1 : Abril 20, 2011, 08:10:28 » |
|
Aun no he revisado tu codigo, pero en general planteate las siguientes cuestiones cuando te de tiempo de CPU excedido:
1) ¿El codigo es el mas optimo? ¿Se ejecuta en un tiempo razonable para los casos mas costosos?
2) ¿Puede que haya un error y en algun caso mi problema se meta en un bucle infinito?
Por cierto, ¿te da tiempo de cpu excedido en general o solo con los casos grandes?
Un saludo.
|
|
|
|
« Última modificación: Abril 20, 2011, 08:14:23 por HQH »
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #2 : Abril 20, 2011, 08:15:42 » |
|
El codigo a priori en un vistazo rapido esta bien. ¿Estas seguro que no se queda colgado esperando la Entrada de datos ?
Es la unica posibilidad que le veo.
|
|
|
|
|
En línea
|
|
|
|
|
Neo444
Visitante
|
 |
« Respuesta #3 : Abril 20, 2011, 11:55:27 » |
|
Bien, creo que se donde está el fallo.
Para cualquier caso la solución es casi instantánea. El problema es lo que he hecho para leer cada caso, ya que después de cada uno leo dos lineas para ponerme en el caso siguiente, ya que hay una linea vacia entre cada uno.
Lo que tengo que hacer es, en la última linea, mirar si se ha llegado al EOF, porque si ahà pulso Ctrl+D se mete en un bucle infinito.
Lo único que no se cómo mirar esto. Si tengo:
getline(cin, vacio);
¿Cómo puedo mirar si en vacÃo está el EOF? En C se que podÃa mirarlo directamente: if (... == EOF)
Pero en C++ no me lo reconoce. ¿Cómo hago esto?
SerÃa mi primer trofeito xDD.
Un saludo y gracias.
|
|
|
|
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #4 : Abril 20, 2011, 06:28:43 » |
|
Yo creo que con algo tan simple como esto deberia funcionar while(cin.getline(vacio,199)) // Cuando hay EOF, no entra en el bucle Te dejo un ejemplito #include <iostream>
using namespace std;
int main() { char vacio[200]; while(cin.getline(vacio,199)) { cout << " Frase " << vacio << endl; } }
Espero te ayude 
|
|
|
|
|
En línea
|
|
|
|
|
Neo444
Visitante
|
 |
« Respuesta #5 : Abril 20, 2011, 08:47:31 » |
|
Muchas gracias, funciona. ahora me da por bueno el caso uno, pero el segundo me sigue diciendo tiempo de cpu superado. Según el enunciado: (30 puntos) Resolver mapas peque ̃os con jardines de no m ́s de 100 puntos enterors n a y como mucho 3 plantas. (70 puntos) Resolver todo tipo de entradas.
No me da los otros 70 puntos. Pero es que he probado con jardines de 300 por 300 con unas 20 plantas y se resuelve instantáneamente, o incluso menos. Supongo que eso no significa tiempo superado. Estoy buscando a ver si se puede quedar pillado esperando datos de algún otro modo porque supongo qeu será eso.
|
|
|
|
« Última modificación: Abril 20, 2011, 08:57:23 por Neo444 »
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #6 : Abril 22, 2011, 12:35:44 » |
|
¿No te dice el tipo de error? (Respuesta erroena, tiempo excedido...)
Si no ponte en contacto con el organizador y le comentas.
|
|
|
|
|
En línea
|
|
|
|
|
Neo444
Visitante
|
 |
« Respuesta #7 : Abril 22, 2011, 10:10:26 » |
|
Si me lo da, tiempo de CPU excedido: Resultado del envÃo 05
Veredicto: No supera los juegos de pruebas: tiempo de CPU superado
Veredicto Caso 1 Supera los juegos de pruebas 30 puntos Caso 2 No supera los juegos de pruebas: tiempo de CPU superado 0 puntos Pero como te digo, he probado con mapas de 300x300 y es prácticamente instantáneo, depués de todo el rato en bloc de notas para hacer la entrada de 300x300 xD. Y no se queda pillado esperando entrada ni nada. Supongo que es un fallo mio asà que lo revisaré a ver si se me ocurre algo, y si no me pongo en contacto con él. Gracias por tu ayuda.
|
|
|
|
« Última modificación: Abril 22, 2011, 10:13:07 por Neo444 »
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #8 : Abril 23, 2011, 09:49:48 » |
|
El enunciado no indica cuanto es el numero maximo de años ni el maximo del tamaño del jardin.
Prueba a hacer un input con varios (muchos, aunque sean iguales) juegos de prueba 300 x 300 y muchos años, a ver si asi mejora tus pruebas y ves si tarda mucho o no.
Eso si , el algoritmo parece simple y estar bien, tiene pinta de ser alguna chorrada por lo que no vaya.
Un saludo.
|
|
|
|
|
En línea
|
|
|
|
|
Neo444
Visitante
|
 |
« Respuesta #9 : Mayo 03, 2011, 03:09:53 » |
|
puff, he tardado en responder (exámenes), pero nada, resuelve más de 10 casos de 500x500 instanteneamente (lo que tarda en sacar el resultado por stdout). Le he enviado un correo al admin de la página de allÃ, hace como dos semanas, y todavÃa no responde.
|
|
|
|
|
En línea
|
|
|
|
|
HQH
|
 |
« Respuesta #10 : Mayo 03, 2011, 08:05:10 » |
|
Espero que hayan ido bien los examenes.
Nada, si paciencia a la respuesta y a ponerse con otros problemas.
Un saludo.
|
|
|
|
|
En línea
|
|
|
|
|