Tema: Dar una imagen, cada ubicación tiene un valor de daño.
Ahora tenemos que caminar desde la primera fila hasta la última fila, y cada cuadro dañará (puede comenzar desde cualquier posición en la primera fila)
El valor final de la lesión es el valor máximo de todas las lesiones recibidas por la persona.
Pregunta: ¿Cuál es el valor mínimo de todas las columnas en la última fila?
Idea: Según el rango de datos dado por el título, la complejidad requerida para atravesar todo el gráfico es 1e6
Pero es poco probable que una transversalidad llegue a una respuesta;
Al ver este problema de buscar el valor mínimo o el valor máximo, podemos pensar en esto en el pasado.
Esta pregunta es de hecho una dicotomía. Después de determinar el rango, tomamos el valor del daño como el objeto, y luego hacemos una dicotomía de acuerdo con la condición de juicio de Guangsou.
Entonces, hablemos de esta condición de juicio en detalle
Cuando determinamos un valor de daño para atravesar el gráfico, si encontramos un valor de daño mayor que este, saltaremos,
Revise todos los puntos que pueden ir, hasta que pueda ir a una de las últimas columnas y luego pueda salir (porque todos los números en la última fila son 0)
Si no puede ir a la última línea, no está satisfecho.
1 #include <bits / stdc ++. H> 2 usando el espacio de nombres std; 3 const int maxn = 1e3 + 10 ; 4 int a [maxn] [maxn]; 5 int vis [maxn] [maxn]; 6 int nxt [ 4 ] [ 2 ] = {{ 1 , 0 }, {- 1 , 0 }, { 0 , 1 }, { 0 , - 1 }}; 7 struct node 8 { 9 int x, y; 10 }; 11 int n, m; 12 int check ( int mid) 13 { 14 cola <nodo> q; Tmp de 15 nodos; 16 memset (vis, 0 , sizeof (vis)); 17 para ( int i = 1 ; i <= m; i ++ ) { 18 tmp.x = 1 ; 19 tmp.y = i; 20 q.push (tmp); 21 vis [ 1 ] [i] = 1 ; 22 } 23 while (! q.empty ()) { 24 tmp = q.front (); 25 // printf ("jajajajaja:% d% d \ n", tmp.x, tmp.y); 26 q.pop (); Paso de 27 nodos; 28 para ( int i = 0 ; i <= 3 ; i ++ ) { 29 step.x = tmp.x + nxt [i] [ 0 ]; 30 step.y = tmp.y + nxt [i] [ 1 ]; 31 if (step.x> n || step.x <= 0 || step.y <= 0 || step.y> m) continuar ; 32 si(a [step.x] [step.y]> mid) continuar ; 33 if (vis [step.x] [step.y]) continuar ; 34 q.push (paso); 35 vis [paso.x] [paso.y] = 1 ; 36 if (step.x == n) devuelve 1 ; 37 } 38 } 39 devuelve 0 ; 40 } 41 int main () 42 { 43 scanf ( " % d% d " , & n, & m); 44 para ( inti = 1 ; i <= n; i ++ ) 45 para ( int j = 1 ; j <= m; j ++ ) { 46 scanf ( " % d " , & a [i] [j]); 47 } 48 int L = 0 , R = 1000 ; 49 int ans; 50 while (L <= R) { 51 int mid = L + R >> 1 ; 52 // printf ("% d \ n", medio); 53 if (check (mid)) { 54 R = mid- 1 ; 55 ans = medio; 56 } 57 más { 58 L = medio + 1 ; 59 } 60 } 61 printf ( " % d \ n " , ans); 62 devuelven 0 ; 63 }