la solución del problema Luo Gu --P2392: kkksc03 abarrotar examen

temas relacionados

tema Enlace

Luo Valley, https://www.luogu.com.cn/problem/P2392 .

título Descripción

El examen final, kkksc03 4 familias necesitan prueba. Por lo tanto, para empezar conjunto de problemas cepillado, cada rama tiene un conjunto de ejercicios, respectivamente, S1, S2, S3, S4 pista del título, cada pregunta se completa tomar algún tiempo, puede variar A1, A2, ..., As1, B1, B2, ..., BS2, C1, C2, ..., CS3, D1, D2, ..., Ds4.

kkksc03 tiene una capacidad, su cerebro izquierdo y derecho puede calcular 22 temas diferentes al mismo tiempo, pero sólo en la misma familia. Por lo tanto, deben ser kkksc03 una rama de una revisión departamento.

Desde kkksc03 también ansioso por tratar con el insecto Los valle, por lo que quiere hacer las cosas lo más rápido posible, por lo que quería saber el menor tiempo para completar la revisión.

Formato de entrada

El título contiene 55 filas de datos: Línea 11, cuatro enteros positivos S1, S2, S3, S4.

La línea 22, a A1, A2, ..., As1 s1 número total, Rama representa el momento de la primera serie de ejercicios cada pregunta consume.

Línea 33, como B1, B2, ..., BS2 número total de s2.

Línea 44, C1, C2, ..., CS3 número s3 total.

Línea 55, como D1, D2, ... DS4 número total s4, es decir, tanto supra.

Formato de salida

línea de salida, el tiempo más corto para la revisión se haya completado.

Ejemplo de entrada

1 2 1 3		
5
4 3
6
2 4 3

Ejemplo de salida

20

Rango de datos

1 ≤ s1, s2, s3, s4 ≤ 20a

1 ≤ A1, A2, ..., As1, B1, B2, ..., BS2, C1, C2, ..., CS3, D1, D2, ..., Ds4 ≤ 60.

tema de análisis

Véase, por el menor tiempo posible, volamos a la programación dinámica correspondiente, esta mochila para resolver un problema en esta 01 es óptima. Pero esta vez utilizamos DFS para resolver problemas.

El análisis del significado de problemas

Es decir, hay cuatro cursos, cada curso tiene una serie de temas, y cada tema tiene tiempo de resolución de problemas, pero podemos al mismo tiempo la misma solución de puerta de dos preguntas, busca el menor tiempo posible. Adecuadamente la completaron DFS.

análisis de los datos de la muestra

De acuerdo con los datos de ejemplo, puede ser que también simular el proceso de DFS. Hay cerebro izquierdo y derecho están disponibles. Cada vez que estamos en primer lugar con el cerebro izquierdo, cerebro derecho entonces, que tal proceso de búsqueda: en primer lugar hemisferio izquierdo del cerebro (un programa), (solución cerebro izquierdo primera cuestión y la segunda cuestión) queda 1 izquierda 2, a derecha e izquierda 1 1, 2 izquierda derecha 1 y 2 tienen el derecho 1, por lo que cuatro combinaciones.

El primer tema

Hay un problema, por lo que podemos obtener:

1, todo el cerebro izquierdo: 5 consumir.

2, todo el cerebro derecho: consumir 5.

Así, un primer objeto de la tiempo mínimo de 5 minutos.

El segundo sujeto

Hay dos preguntas, por lo que podemos obtener:

1, todo el cerebro izquierdo: Procesado 4 + 3 = 7.

2, un lado izquierdo del cerebro de resolución de problemas, la solución de cerebro derecho 2: max Procesado (4,3) = 4.

3, la resolución de cerebro izquierdo 2, problema cerebro derecho solución de 1: max Procesado (3,4) = 4.

4, todo el cerebro derecho: Procesado 4 + 3 = 7.

Por lo tanto los sujetos con el segundo tiempo mínimo de 4 minutos.

El tercer sujeto

Hay un problema, por lo que podemos obtener:

1, todo el cerebro izquierdo: 6 tiempo.

2, todo el cerebro derecho: 6 que consume tiempo.

Por lo tanto el tiempo mínimo de los terceros sujetos durante 6 minutos.

temas cuarto

Hay tres preguntas, por lo que podemos obtener:

1, todo el lado izquierdo del cerebro es completa. Procesado de este modo es 4 + 2 + 3 = 9.

2, el cerebro izquierdo se completa 1,2 problema, cerebro derecho tres problemas a resolver. Procesado de esta manera es max (2 + 4, 3) = 6.

3, el cerebro izquierdo se completa 1,3 problema, cerebro derecho dos problemas a resolver. Procesado de esta manera es max (2 + 3, 4) = 5.

4, el lado izquierdo del cerebro para completar la pregunta 1, 2 y 3 para completar el problema lado derecho del cerebro. Procesado de este modo es max (2, 4 + 3) = 7.

5, cerebro izquierdo 23 título completo, una completa cerebro título derecha. Procesado de esta manera es max (4 + 3, 2) = 7.

6, dos problemas que resolver el cerebro izquierdo, cerebro derecho se completa 1,3 título. Procesado de este modo es max (4, 3 + 2) = 5.

7, tres problemas que resolver cerebro izquierdo, cerebro derecho se completa 1,2 título. Procesado de este modo es max (3, 2 + 4) = 6.

8, todo el cerebro derecho es completa. Procesado de este modo es 4 + 2 + 3 = 9.

Por lo tanto, el tiempo mínimo de las cuartas personas durante 5 minutos.

Aquí podemos ver es el título asignado para enumerar todas las combinaciones posibles de dos cerebros. Si una gran cantidad de datos, podemos usar las puntas de las ramas menos. El proceso como se describe anteriormente, un medio desperdicia.

El tiempo total

NATURAL es 5 + 4 + 5 + 6 = 20.

análisis de los datos Escala

De acuerdo con la descripción del título, podemos saber que un total de cuatro sujetos, cada sujeto hasta 20 temas, y por lo tanto el mayor conjunto de datos de 4 * 20 = 80. En otras palabras, el uso de DFS búsqueda de título, no se puede obligar a recortar.

pensamiento algoritmo

1, se leen los datos.

2, de un sujeto, un tema primero se inicia DFS.

3, la salida.

código de referencia AC

Versión violencia DFS

#include <iostream>
#include <climits>
#include <algorithm>

using namespace std;

const int MAXN = 4;
const int MAXM = 22;
const int MAXT = 2;

int subjects[MAXN];//科目
int times[MAXN][MAXM];//时间
bool used[MAXN][MAXM];//是否复习完成
int Left;//左脑
int Right;//右脑
int minn;//某一门科目最小时间

//从第i门的第j题目开始复习
void dfs(int i, int j) {
    //判断本次搜索是否结束
    if (j>=subjects[i]) {
        minn = min(minn, max(Left, Right));
        return;
    }

    //左脑工作
    Left += times[i][j];
    dfs(i, j+1);
    Left -= times[i][j];

    //右脑工作
    Right += times[i][j];
    dfs(i, j+1);
    Right -= times[i][j];
}

int main() {
    for (int i=0; i<4; i++) {
        cin >> subjects[i];
    }
    for (int i=0; i<4; i++) {
        for (int j=0; j<subjects[i]; j++) {
            cin >> times[i][j];
        }
    }

    //搜索
    int ans = 0;//最后的时间
    for (int i=0; i<4; i++) {
        Left=0;//左脑清零
        Right=0;//右脑清零
        minn = INT_MAX;//由于是要最小值
        dfs(i, 0);//从第i门的第一题开始复习
        ans += minn;
    }

    cout << ans << endl;

    return 0;
}

 

Publicados 235 artículos originales · ganado elogios 289 · Vistas 1,07 millones +

Supongo que te gusta

Origin blog.csdn.net/justidle/article/details/104893495
Recomendado
Clasificación