Olimpiada Oaxaqueña de Informática
  • Bienvenido a la Olimpiada Oaxaqueña de Informática
  • Temario
    • Introducción a la Programación
      • Definición de computadora
      • Definición de Sistema Operativo
      • Definición de lenguaje de programación
      • Definición de compilador
      • Sistema Binario y Hexadecimal
      • Operaciones AND, OR, NOT, XOR
      • Definición y ejemplo de algoritmos
      • Representación gráfica de un algoritmo
      • Qué es un pseudocódigo
        • Estructura base y Variables
        • Condicionales y ciclos
      • Configuración e instalación de compilador de C y C++
    • Lenguajes de Programación C y C++
      • Presentación de C y C++ como lenguajes de programación
      • Estructura de un programa en C++
        • Ejemplos de códigos en C++
      • Tipos de datos y variables
      • Entrada y salida de datos STDIN SDTOUT
      • Estructuras de Control y Repetición
      • Introducción a estructuras de datos: arreglos
    • Algoritmos de ordenamiento
      • Bubble Sort
    • Estructuras de datos
      • Pilas (Stack)
    • Paradigmas de Solución de Problemas
    • Gráfos
    • Matemáticas
    • Procesamiento de Cadenas
  • OOI 2019
    • Cursos online
      • Clase 1
      • Clase 2
      • Clase 3
      • Clase 4
      • Clase 5
      • Clase 6
      • Clase 7
      • Clase 8
      • Clase 9
      • Clase 10
      • Clase 11
      • Clase 12
      • Clase 13
      • Clase recursión introductorio
  • OOI 2020
    • Instrucciones para nuevos miembros
    • Cursos introductorios
      • Clase 1
      • Clase 2
      • Clase 3
      • Clase 4
      • Clase 5
      • Clase 6
      • Clase 7
      • Clase 8
      • Clase 9
      • Clase 10
      • Clase 11
      • Clase 12
      • Clase 13
      • Clase 14
      • Clase 15
      • Clase 16
      • Clase 17
      • Clase 18
      • Clase 19
      • Clase 20
      • Clase 21
      • Clase 22
    • Cursos avanzados
      • Temario
      • Sesión 1
      • Sesión 2
      • Sesión 3-4
      • Sesión 5
      • Sesión 6
      • Sesión 7
      • Sesión 8
      • Sesión 9-10
      • Sesión 11
      • Sesión 12
      • Sesión 13
      • Sesión 14
      • Sesión 15
      • Sesión 16
      • Sesión 17
      • Sesión 18
      • Sesión 19
      • Sesión 20
      • Sesión 21
      • Sesión 22
    • Cursos matemáticas discretas
      • Sesión 1
      • Sesión 2
  • OOI 2021
    • Fase 4. Semana 1
  • Misceláneos
    • Complejidad de un algoritmo
    • Tutorial instalación VS Code, compilador y debugger para C++
Powered by GitBook
On this page
  • Ejercicio de clase
  • Descripción
  • Entrada
  • Salida
  • Solución
  • Tarea
  1. OOI 2019
  2. Cursos online

Clase 12

PreviousClase 11NextClase 13

Last updated 6 years ago

Temas: Problemas de práctica

Ejercicio de clase

Descripción

La descripción del problema original se encuentra . Para este ejercicio se ha simplificado un poco.

El problema consiste en repartir el canto de la canción de Happy Birthday entre las invitados de una fiesta. Si no recuerdas la canción de Happy Birthday es la siguiente (la festejada se llama Rujia):

Happy birthday to you
Happy birthday to you
Happy birthday to Rujia
Happy birthday to you

Cada persona debe cantar en orden al menos una palabra de la canción, así que si son 5 personas el reparto sería el siguiente:

Persona 1: Happy
Persona 2: birthday
Persona 3: to
Persona 4: you
Persona 5: Happy
Persona 1: birthday
Persona 2: to
Persona 3: you
Persona 4: Happy
Persona 5: birthday
Persona 1: to
Persona 2: Rujia
Persona 3: Happy
Persona 4: birthday
Persona 5: to
Persona 1: you

Observa que la canción contiene 16 palabras, así que si hay 17 personas o más la canción se debe cantar completa nuevamente hasta que todas las personas hayan podido cantar al menos una parte de la canción.

Entrada

La entrada consiste en un número N entero positivo menor a 200, que indica el número de personas invitadas.

Salida

Debes imprimir el reparto de la canción entre las personas como en el ejemplo anterior.

Ejemplo de entrada

20

Ejemplo de salida

Persona 1: Happy
Persona 2: birthday
Persona 3: to
Persona 4: you
Persona 5: Happy
Persona 6: birthday
Persona 7: to
Persona 8: you
Persona 9: Happy
Persona 10: birthday
Persona 11: to
Persona 12: Rujia
Persona 13: Happy
Persona 14: birthday
Persona 15: to
Persona 16: you
Persona 17: Happy
Persona 18: birthday
Persona 19: to
Persona 20: you
Persona 1: Happy
Persona 2: birthday
Persona 3: to
Persona 4: you
Persona 5: Happy
Persona 6: birthday
Persona 7: to
Persona 8: Rujia
Persona 9: Happy
Persona 10: birthday
Persona 11: to
Persona 12: you

Solución

Sabemos que la canción se debe cantar nuevamente si hay personas que no alcanzan a cantarla.

¿Cómo sabemos cuántas veces se debe cantar la canción completa?

Respuesta: Usando la división y el residuo.

Como son 16 palabras a cada persona le debe tocar al menos una palabra de la canción, si dividimos el número de personas entre el número de palabras nos indica cuántas veces podemos repetir la canción.

Si hay un residuo indica que hubo 1 o más personas que se quedan sin cantar, así que se debe repetirla una vez más. Veamos el código.

#include <iostream>
#include <string>
using namespace std;

int main() {
    int guests;
    string song[16] = {
        "Happy", "birthday", "to", "you",
        "Happy", "birthday", "to", "you",
        "Happy", "birthday", "to", "Rujia",
        "Happy", "birthday", "to", "you",
    };

    cin >> guests;
    
    // Calculamos cuantas veces se debe cantar la canción
    int song_times = guests / 16;
    if (guests % 16 != 0) {
        song_times ++;
    }
    
    // Imprimimos la canción el número de veces requerido
    // para que todos los invitados al menos la canten una vez
    for (int i = 0; i < song_times * 16; i++) {
        // Nos auxiliamos del operador módulo para rotar los invitados
        int guest = (i % guests) + 1;
        // Nos auxiliamos del operador módulo para rotar las palabras
        // de la canción
        string word = song[i%16];
        // Imprimimos la persona y la palabra que le toca
        cout << "Persona " << guest << ": " << word << endl;
    }

    return 0;
}

Tarea

  1. Repasar las divisiones o el operador módulo.

  2. Divide y obtiene el residuo los número del 0 al 20 entre 2, 3, 4, 5 y 6. Observa como se comporta el residuo.

  3. Encuentra otra forma y rescribe el código sin usar el operador módulo para rotar las palabras y las personas.

aquí