P1902 Asesinato Embajador Amplia búsqueda + Dos puntos

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 }
Ver código

 

Supongo que te gusta

Origin www.cnblogs.com/pangbi/p/12689898.html
Recomendado
Clasificación