Tema de entrenamiento codicioso 1

1: Reclutamiento del club Swan College

Autor
Unidad de Liaoning Facultad de Asuntos Exteriores, Universidad Central Sur de Silvicultura y Tecnología

El club Swan College recluta nuevos estudiantes y los nuevos seminarios de reclutamiento se encuentran dispersos en diferentes períodos de tiempo. Xiao Huahua, una estudiante de primer año, quiere saber a cuántos seminarios de reclutamiento nuevos puede asistir en total (no puede interrumpir ni irse cuando asiste a un nuevo seminario de reclutamiento). ).
[Descripción del problema] Este problema consiste en programar varias actividades informativas de reclutamiento competitivas, todas las cuales requieren el uso exclusivo de un determinado recurso público (Xiaohuahua). El objetivo de la programación es encontrar un conjunto máximo de actividades mutuamente compatibles.
El problema de selección de actividades consiste en seleccionar el subconjunto más grande de problemas mutuamente compatibles.

[Consejos] Primero debe ordenar todas las actividades en orden ascendente por hora de finalización, luego seleccionar posibles combinaciones de tiempo y encontrar el número máximo de combinaciones. Usar la función de clasificación qsort() es una buena opción. El prototipo de función de qsort es:
void qsort(voidbase,size_t num,size_t width,int(__cdeclcompare)(const void*,const void*));
Función: Usar rutina de clasificación rápida para ordenar Archivo de encabezado: stdlib.h
Parámetro: 1 La primera dirección de la matriz a ordenar; 2 el número de elementos a ordenar en la matriz; 3 el espacio ocupado por cada elemento; 4 un puntero a una función, utilizado para determinar el orden de clasificación

Formato de entrada:
la primera línea es n, lo que indica que hay n sesiones informativas de reclutamiento. Las siguientes n líneas tienen dos números enteros en cada línea que indican la hora de inicio y la hora de finalización, representadas por el número de horas a partir de las 0 en punto del primer día de la reunión de reclutamiento (formato de 24 horas). norte <= 1000.

Formato de salida:
Número máximo de ferias de empleo atendidas.

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

 3  
 9 10  
 10 20  
 8 15  

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

2

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

Análisis: Según el significado de la pregunta, se puede abstraer la siguiente imagen:
Insertar descripción de la imagen aquí
de la imagen se puede ver que la solución con el punto final más pequeño cada vez que elegimos debe ser la solución óptima, y ​​la solución debe ser menor que o igual a esta solución.

#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 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;
}

2: ver una película

Autor Wang Huiyong
Unidad Universidad de Ciencia y Tecnología de Hebei

Finalmente es fin de semana y obviamente me encanta ver películas. Quería ver tantas películas completas como fuera posible en un día.
Ahora te da el calendario de reproducción de sus películas favoritas, con la esperanza de que puedas ayudarlo a organizarlas de manera razonable.

Formato de entrada:
la entrada contiene varios conjuntos de datos de prueba. La primera línea de cada conjunto de entradas es un número entero n (n <= 100), que representa el número total de películas que le gustan a Mingming.
En las siguientes n líneas, cada línea ingresa dos números enteros si y ei (1 <= i <= n), que indican la hora de inicio y finalización de la i-ésima película. Para simplificar el problema, cada tiempo está representado por un entero positivo.
Cuando n = 0, la entrada finaliza.

Formato de salida:
para cada conjunto de entradas, genere la cantidad de películas que se pueden ver por completo.

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

12
1 3
3 4
0 7
3 8
15 19
15 20
10 15
8 18
6 12
5 10
4 14
2 9
0

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

5

Límite de longitud del código
16 KB
Límite de tiempo
1000 ms
Límite de memoria
32 MB

Análisis: Igual que la primera pregunta.

#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 n;
    while (cin >> n, 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: Participa en más actividades y tu vida será más emocionante.

Autor
Unidad Long Xing: Instituto de Tecnología de Ingeniería de Guizhou

Xiao Pan vino a la Universidad de Guizhou para estudiar en la universidad este año y su vida universitaria es colorida. Hay muchos clubes en la universidad y cada club realiza algunas actividades. Xiao Pan es un niño activo que quiere participar en más actividades. Todos sabemos que diferentes actividades tienen diferentes créditos. Cada actividad tiene una hora de inicio y una hora de finalización.

Mañana es fin de semana y cada club que realice actividades publicará la hora de inicio, la hora de finalización y los créditos de la actividad en la cuenta pública de WeChat de la escuela con anticipación. Xiao Pan conversó contigo sobre ir a participar en actividades mañana. Vio que había muchas actividades. Quería participar en más actividades, pero algunas actividades entrarían en conflicto. Tú y Xiao Pan calcularon el número máximo de actividades que podía realizar. Participa en mañana. ¿Y cuántos créditos se pueden obtener?

Formato de entrada:
en la primera línea, n representa el número de actividades. (n<= 100)
Desde la segunda línea hasta la línea n + 1, cada línea tiene s, e, f (el momento en que comienza la actividad s, el momento en que finaliza la actividad e y la puntuación de la actividad f), s, e , f son enteros positivos, s, e <= 22, f <= 100.

Formato de salida:
envíe el número máximo de actividades en las que Xiao Pan puede participar y las puntuaciones obtenidas.

Ejemplo de entrada:

5
1 3 5
2 3 5
3 4 5
4 5 5
4 6 5

Muestra de salida:

3 15

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

Análisis: Igual que la primera pregunta.

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 110;

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

int main()
{
    
    
    int n;
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> f[i].x >> f[i].y >> f[i].z;
    
    sort(f,f + n);
    
    int end = f[0].y;
    int ans = f[0].z, cnt = 1;
    for (int i = 0; i < n - 1; i ++ )
    {
    
    
        if(end <= f[i + 1].x)
        {
    
    
            end = f[i + 1].y;
            ans += f[i + 1].z;
            cnt ++;
        }
    }
    cout << cnt << ' ' << ans;
    
    return 0;
}

4: problema de embalaje

Autor
Unidad del grupo del curso DS Universidad de Zhejiang

Supongamos que hay N elementos, cuyos tamaños son s 1 , s 2 ,..., s i ,..., s N , donde s i es un número entero que satisface 1≤s i ≤100. Estos artículos deben empaquetarse en un lote de cajas con una capacidad de 100 (número de serie 1-N). El método de embalaje es: para cada artículo, escanee las cajas secuencialmente y coloque el artículo en la primera caja que sea lo suficientemente grande para acomodarlo. Escriba un programa para simular este proceso de embalaje y genere el número de caja de cada artículo y el número de cajas necesarias para colocar todos los artículos.

Formato de entrada:
la primera línea de entrada proporciona el número de elementos N (≤1000); la segunda línea proporciona N enteros positivos s i ( 1≤s i ≤100, que indica el tamaño del i-ésimo elemento).
Formato de salida:
genera el tamaño de cada elemento y el número de cuadro en el que se encuentra en el orden de entrada. Cada elemento ocupa una línea y la última línea genera el número requerido de cuadros.

Ejemplo de entrada:

8
60 70 80 90 30 40 10 20

Muestra de salida:

60 1
70 2
80 3
90 4
30 1
40 5
10 1
20 2
5

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

Análisis: Simule directamente el proceso de carga de elementos en un cuadro según la pregunta, si no se puede cargar, agregue un nuevo cuadro.

Insertar descripción de la imagen aquí

#include <iostream>

using namespace std;

const int N = 1010;

int n, idx;
int f[N], a[N];

int main()
{
    
    
    cin >> n;
    for (int i = 0; i < n; i ++ ) cin >> a[i];
    
    for (int i = 0; i < n; i ++ )
    {
    
    
        int j = 0;
        for ( ;j < idx; j ++ )
            if(f[j] + a[i] <= 100)
            {
    
    
                f[j] += a[i];
                cout << a[i] << ' ' << j + 1 << endl;
                break;
            }
        if(j == idx)  // 增加一个箱子
        {
    
    
            f[idx ++ ] += a[i];
            cout << a[i] << ' ' << idx << endl;
        }
    }
    cout << idx;
    
    return 0;
}

5: Reclutamiento de contadores públicos I

Autor
Unidad Long Xing: Instituto de Tecnología de Ingeniería de Guizhou

El nuevo semestre ha comenzado, nuestro CPA se estableció en junio de 2019 con 20 veteranos en ese momento. Ahora necesitamos reclutar nuevos miembros. Cada año, en el nuevo semestre, el Centro de Servicios de la Sociedad organizará una Batalla de los Cien Regimientos. Nuestro CPA está reclutando nuevos miembros por primera vez y esperamos darles la bienvenida a nuevos miembros.
Todos los días, los veteranos van a reclutar gente nueva, cada vez que reclutan a una nueva persona, la nueva persona escribirá una letra mayúscula en el papel. CPA tiene cuatro departamentos: Departamento de Competencia, Departamento de Publicidad, Departamento de Oficina y Departamento de Organización. Estipulamos que A representa el departamento de Competencia, B representa el Departamento de Propaganda, C representa la Oficina y D representa el Departamento de Organización. Después de que el club recluta gente nueva, ¿es necesario contar cuántas personas hay en cada departamento?

Formato de entrada:
ingrese una línea de cadena, la longitud de la cadena no debe ser mayor que 10000.

Formato de salida:
salto de línea para la salida de cada departamento.

Ejemplo de entrada:

AABBCCDD

Muestra de salida:

Competition department 2 people!
Propaganda Department 2 people!
Office 2 people!
Organization Department 2 people!

Nota:
Tal vez algunas personas sean traviesas con más de cuatro caracteres ABCD. El número real de personas se basa en ABCD.
Límite de longitud del código
16 KB
Límite de tiempo
400 ms
Límite de memoria
64 MB

Análisis: Simular el proceso según el significado de la pregunta.

#include <iostream>
#include <algorithm>

using namespace std;

struct node
{
    
    
    string name;
    int num;
}f[4];

int main()
{
    
    
    string s;
    getline(cin, s);
    
    for (auto p : s)
        if(p >= 'A' && p <= 'D')
            f[p - 'A'].num ++;
    f[0].name = "Competition department";
    f[1].name = "Propaganda Department";
    f[2].name = "Office";
    f[3].name = "Organization Department";
    
    for (int i = 0; i < 4; i ++ )
        cout << f[i].name << ' ' << f[i].num << ' ' <<"people!\n";
    
    return 0;
}

6: Reclutamiento de contadores públicos II

Autor
Unidad Long Xing: Instituto de Tecnología de Ingeniería de Guizhou

El nuevo semestre ha comenzado, nuestro CPA se estableció en junio de 2019 con 20 veteranos en ese momento. Ahora necesitamos reclutar nuevos miembros. Cada año, en el nuevo semestre, el Centro de Servicios de la Sociedad organizará una Batalla de los Cien Regimientos. Nuestro CPA está reclutando nuevos miembros por primera vez y esperamos darles la bienvenida a nuevos miembros.

Todos los días, los veteranos van a reclutar gente nueva, cada vez que reclutan a una nueva persona, la nueva persona escribirá una letra mayúscula en el papel. CPA tiene cuatro departamentos: Departamento de Competencia, Departamento de Publicidad, Departamento de Oficina y Departamento de Organización. Estipulamos que A representa el departamento de Competencia, B representa el Departamento de Propaganda, C representa la Oficina y D representa el Departamento de Organización. Después de que el club recluta gente nueva, ¿es necesario contar cuántas personas hay en cada departamento? Un día, el presidente llega de repente y necesita que le des una lista del personal del departamento. La lista debe ordenarse de mayor a menor según la cantidad de personas. Si eres inteligente, le escribirás un programa directamente al presidente y déjele usar el programa para ordenar directamente.

Formato de entrada:
ingrese una línea de cadena, la longitud de la cadena no debe ser mayor que 10000.

Formato de salida:
si el número de personas es el mismo, ordénelas en el diccionario de pequeño a grande y incluya cada departamento en la salida.

Ejemplo de entrada:

AABBCCCDDAA

Muestra de salida:

Competition department 4 people!
Office 3 people!
Organization Department 2 people!
Propaganda Department 2 people!

Nota:
Algunas personas pueden ser traviesas con más de cuatro caracteres ABCD. El número real de personas se basa en ABCD.
Límite de longitud del código
16 KB
Límite de tiempo
1000 ms
Límite de memoria
64 MB

Análisis: Simular el proceso según el significado de la pregunta.

#include <bits/stdc++.h>

using namespace std;

const int N = 10010;

struct node{
    
    
    int num;
    string name;
}f[N];

bool cmp(node a, node b)
{
    
    
    if(a.num != b.num) return a.num > b.num;
    return a.name < b.name;
}
int cnt[4];

int main()
{
    
    
    string s;
    getline(cin, s);
    for (auto p : s)
        if(p >= 'A' && p <= 'D')
            cnt[p - 'A'] ++;
    for (int i = 0; i < 4; i ++ )
        f[i].num = cnt[i];
    f[0].name = "Competition department";
    f[1].name = "Propaganda Department";
    f[2].name = "Office";
    f[3].name = "Organization Department";
    
    sort(f, f + 4, cmp);
    
    for (int i = 0; i < 4; i ++ )
    {
    
    
        cout << f[i].name << " " << f[i].num << " ";
        cout << "people!\n";
    }
    return 0;
}

7: h0154 Piratas del Caribe - Problema de carga óptima

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

En la parte sureste de América del Norte hay una misteriosa zona marítima con mar azul, cielo azul y sol radiante: se trata del Mar Caribe, donde se dice que los piratas son más activos. En el siglo XVII, este era el único lugar donde las flotas mercantes del continente europeo llegaban a América, por lo que las actividades de piratería estaban muy extendidas en aquella época. Los piratas no sólo atacaban a los comerciantes que pasaban, sino que incluso atacaban a los barcos reales británicos... Uno Un día, los piratas interceptaron un barco
. Un barco de carga lleno de todo tipo de antigüedades. Cada antigüedad no tiene precio. Una vez rota, pierde su valor. Aunque el barco pirata es lo suficientemente grande, la capacidad de carga es C y el peso de cada antigüedad es wi ¿Cómo deberían los piratas cargar tantos tesoros como sea posible en el barco pirata?

Formato de entrada:
en la primera línea, ingrese T grupos de datos de prueba. Para cada grupo de datos de prueba, ingrese la capacidad de carga c y el número de antigüedades n. En la siguiente línea, ingrese el peso wi de cada antigüedad, separados por espacios .

Formato de salida:
Número máximo de antigüedades que se pueden cargar en cada grupo

Ejemplo de entrada:

1
30 8
4 10 7 11 3 5 14 2

Muestra de salida:

5

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

Análisis: Según el análisis del significado de la pregunta, solo necesitamos seleccionar la antigüedad con el peso más pequeño cada vez para obtener un conjunto de soluciones óptimas, por lo que solo necesitamos ordenarla de pequeña a grande y recorrerla una vez.

#include <iostream>
#include <algorithm>

using namespace std;

const int N = 10010;

int m, n;
int w[N];

int main()
{
    
    
    int T;
    cin >> T;
    
    while (T -- )
    {
    
    
        cin >> m >> n;
        for (int i = 0; i < n; i ++ ) cin >> w[i];
        
        sort(w, w + n);
        
        int cnt = 0;
        for (int i = 0; i < n; i ++ )
        {
    
    
            if(w[i] <= m)
            {
    
    
                m -= w[i];
                cnt ++;
            }
        }
        cout << cnt << endl;
    }
    return 0;
}

Supongo que te gusta

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