Entrenamiento especial codicioso 2

1: Problemas con la disposición del lugar

Autor Chen Xiaomei
Unidad Universidad de Estudios Extranjeros de Guangdong
Fuente del título: Wang Xiaodong "Diseño y análisis de algoritmos"

Suponga que desea programar un lote de eventos en suficientes lugares y desea utilizar la menor cantidad de lugares posible. Diseñe un
algoritmo codicioso eficiente para la programación. (Este problema es en realidad el famoso problema de coloración del gráfico. Si cada actividad se considera como un
vértice del gráfico, las actividades incompatibles están conectadas por aristas. El número mínimo de coloraciones que hacen que los vértices adyacentes tengan colores diferentes corresponde al número mínimo
de lugares. )

Formato de entrada:
la primera línea contiene 1 entero positivo k, lo que indica que hay k actividades por organizar.
En las siguientes k líneas, cada línea tiene 2 números enteros positivos, que representan la hora de inicio y la hora de finalización de k actividades por programar, respectivamente. El tiempo
se mide en minutos a partir de las 0 en punto.

Formato de salida:
genera el número mínimo de lugares.

Ejemplo de entrada:

5
1 23
12 28
25 35
27 80
36 50 

Muestra de salida:
aquí se proporciona la salida correspondiente. Por ejemplo:

3

Límite de longitud del código
16 KB
Límite de tiempo
400 ms
Límite de memoria
64 MB

Análisis: Solo necesitamos usar el algoritmo codicioso para encontrar la solución óptima para cada recorrido. Si lo realizamos como máximo n veces, podremos recorrer todas las veces. Sin embargo, se producirá un error si ordenamos por el final. hora. Debemos ordenar por hora de inicio. Se desconoce el motivo.

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10010;

int vis[N];

struct node
{
    
    
    int x, y;
    bool operator < (const node &a)
    {
    
    
        return x < a.x;
    }
}f[N];

int main()
{
    
    
    int n;
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> f[i].x >> f[i].y;
    
    sort(f, f + n);
    
    int cnt = 0;
    for (int i = 0; i < n; i ++ )
    {
    
    
        if(!vis[f[i].y])
        {
    
    
            cnt ++;
            vis[f[i].y] = 1;
            int end = f[i].y;
            for(int j = i + 1; j < n; j ++ )
            {
    
    
                if(end <= f[j].x && !vis[f[j].y])
                {
    
    
                    end = f[j].y;
                    vis[f[j].y] = 1;
                }
            }
        }
    }
    cout << cnt;
    
    return 0;
}

2: h0145.Organizaciones de la reunión.

Autor
Unidad Huang Zhengpeng: Instituto de Tecnología de Ingeniería de Guizhou

Hay muchas actividades en el auditorio de la escuela todos los días, a veces los horarios planificados de estas actividades pueden entrar en conflicto y es necesario seleccionar algunas actividades para realizarlas. El trabajo de Xiao Liu es organizar actividades en el auditorio de la escuela y puede organizar como máximo una actividad a la vez. Ahora Xiao Liu tiene algunos planes de actividades. Quiere organizar tantas actividades como sea posible. ¿Cómo debería organizarlas?

Formato de entrada:
la primera línea es un número entero m (m<100) que indica un total de m conjuntos de datos de prueba.
La primera línea de cada conjunto de datos de prueba es un número entero n (1 <n <10000), lo que indica que hay n actividades en los datos de prueba.
Las siguientes n líneas, cada línea tiene dos números enteros positivos Bi, Ei (0 <= Bi, Ei <10000), que representan respectivamente el tiempo de inicio y finalización de la i-ésima actividad (Bi <= Ei)

Formato de salida:
para cada conjunto de entradas, genere el número máximo de actividades que se pueden organizar.
La salida de cada grupo ocupa una línea.

Muestra de entrada:
proporcione un conjunto de entradas aquí. Por ejemplo:

2
2
1 10
10 11
3
1 10
9 11
11 20

Muestra de salida:
aquí se proporciona la salida correspondiente. Por ejemplo:

2
2

Límite de longitud del código
16 KB
Límite de tiempo
400 ms
Límite de memoria
64 MB

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10010;

struct node
{
    
    
    int x, y;
    bool operator < (const node &a)
    {
    
    
        return y < a.y;
    }
}f[N];

int main()
{
    
    
    int T;
    cin >> T;
    while (T -- )
    {
    
    
        int n;
        cin >> n;
        for (int i = 0; i < n; i ++ ) cin >> f[i].x >> f[i].y;

        sort(f,f + n);

        int end = f[0].y;
        int cnt = 1;
        for (int i = 0; i < n - 1; i ++ )
        {
    
    
            if(end <= f[i + 1].x)
            {
    
    
                end = f[i + 1].y;
                cnt ++;
            }
        }
        cout << cnt << endl;
    }
    return 0;
}

3: Mínima no presentación

Autor usx Unidad grupal del curso de programación
Universidad de Artes y Ciencias de Shaoxing

Un día, Nono tenía muchas actividades a las que asistir. Pero debido a demasiadas actividades, Nono no pudo participar en todas las actividades. Ayude a Nono a hacer arreglos para que pueda participar en tantas actividades como sea posible y reducir la cantidad de citas perdidas. Supuesto: Puedes participar inmediatamente en otra actividad tan pronto como finalice una actividad.

Formato de entrada:
primero ingrese un número entero T, que indica el número de grupos de datos de prueba, y luego T grupos de datos de prueba. Cada conjunto de datos de prueba primero ingresa un número entero positivo n, que representa el número total de actividades en las que se debe participar ese día, y luego ingresa n líneas. Cada línea contiene dos números enteros i y j (0≤i <j <24) , que representan la hora de inicio y finalización de una actividad respectivamente.

Formato de salida:
para cada conjunto de pruebas, genere el número total mínimo de citas perdidas en una línea.

Ejemplo de entrada:

1
5
1 4
3 5
3 8
5 9
12 14

Muestra de salida:

2

Límite de longitud del código
16 KB
Límite de tiempo
400 ms
Límite de memoria
64 MB

Análisis: solo necesitamos usar la estrategia codiciosa para encontrar la solución óptima y luego restar la solución óptima del número total de actividades para obtener la estrategia mínima predeterminada.

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

struct node
{
    
    
    int x, y;
    bool operator < (const node &a)
    {
    
    
        return y < a.y;
    }
}f[N];

int main()
{
    
    
    int T;
    cin >> T;
    while (T -- )
    {
    
    
        int n;
        cin >> n;
        for (int i = 0; i < n; i ++ ) cin >> f[i].x >> f[i].y;

        sort(f,f + n);

        int end = f[0].y;
        int cnt = 1;
        for (int i = 0; i < n - 1; i ++ )
        {
    
    
            if(end <= f[i + 1].x)
            {
    
    
                end = f[i + 1].y;
                cnt ++;
            }
        }
        cout << n - cnt << endl;
    }
    return 0;
}

4: problema de selección de actividad

Autor Li Tingyuan
Unidad de Vuelo de Aviación Civil Universidad de China

Supongamos un conjunto S = {a 1 , a 2 ,..., an } con n actividades . Estas actividades utilizan el mismo recurso (como la misma sala de conferencias), y este recurso solo puede ser utilizado por una actividad. . Cada actividad a i tiene una hora de inicio s i y una hora de finalización f i , donde 0<=s i <f i <=32767. Si se selecciona, la tarea ai ocurre durante el intervalo de tiempo medio abierto [s i , fi ) . Se dice que dos actividades a i y a j son compatibles si satisfacen [s i ,fi i ) y [s j , f j ) sin superponerse. Es decir, si s i >=f j o s j >=f i , entonces a i y a json compatibles. En el problema de selección de actividades, deseamos seleccionar un conjunto máximo de actividades compatibles.

Formato de entrada:
la primera línea es un número entero n (n≤1000);

Las siguientes n líneas tienen dos números enteros en cada línea, el primero es s i y el segundo es f i (0<=s i <f i <=32767).

Formato de salida:
genera el número máximo de actividades que se pueden organizar.

Ejemplo de entrada:

11
3 5
1 4
12 14
8 12
0 6
8 11
6 10
5 7
3 8
5 9
2 13

Muestra de salida:

4

Explicación de ejemplo:
Las cuatro actividades programadas son 1 4, 5 7, 8 11 y 12 14.

Límite de longitud del código
16 KB
Límite de tiempo
400 ms
Límite de memoria
64 MB

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 1010;

struct node
{
    
    
    int x, y;
    bool operator < (const node &a)
    {
    
    
        return y < a.y;
    }
}f[N];

int main()
{
    
    
    int n;
    while (cin >> n)
    {
    
    
        for (int i = 0; i < n; i ++ ) cin >> f[i].x >> f[i].y;

        sort(f,f + n);

        int end = f[0].y;
        int cnt = 1;
        for (int i = 0; i < n - 1; i ++ )
        {
    
    
            if(end <= f[i + 1].x)
            {
    
    
                end = f[i + 1].y;
                cnt ++;
            }
        }
        cout << cnt << endl;
    }
    return 0;
}

5: problema de eliminación

Autor Ren Wei
afiliado a la Universidad Agrícola de Hebei

Hay un entero positivo de longitud n (n <= 240). Saque k (k < n) números y mantenga los números restantes en su orden original. Encuentre el número mínimo de este entero positivo después de eliminarlo.

Formato de entrada:
n y k

Formato de salida:
un número que representa el valor mínimo de este entero positivo después de la eliminación.

Ejemplo de entrada:

178543 4

Muestra de salida:

13

Límite de longitud del código
16 KB
Límite de tiempo
400 ms
Límite de memoria
64 MB

Análisis: De acuerdo con la estrategia codiciosa, siempre que se elija la solución óptima cada vez, el resultado final debe ser la solución óptima. La estrategia que acabo de pensar cuando comencé esta pregunta es eliminar el número más grande cada vez, y la secuencia restante debe ser la solución óptima. Por El método de prueba por contradicción muestra que si hay una cadena de ceros en medio de un número, se producirá un error. Por ejemplo: 30008 1. La solución óptima debería ser 8. Entonces Después de pensarlo más tarde, descubrí que siempre que el número eliminado cada vez sea mayor que el siguiente número, se puede obtener la solución óptima.

#include <iostream>

using namespace std;

int vis[250];

int main()
{
    
    
    string s;
    int n;
    cin >> s >> n;
    
    for (int i = 0; i < n; i ++ )
    {
    
    
        for (int j = 0; j < s.size(); j ++ )
            if(s[j] > s[j + 1] || j == s.size() - 1)
            {
    
    
                s.erase(s.begin() + j);
                break;
            }
    }
    while (s[0] == '0') s.erase(s.begin()); //  删除前导零
    
    cout << s;
    
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/qq_52331221/article/details/127811420
Recomendado
Clasificación