Tarefa 2 - Maratona das lesmas

Maratona das lesmas

Esta tarefa é baseada em uma tarefa similar da Olimpíada Cearence de Informática de 2014. Na corrida de lesmas, cada lesma é classificada em um nível dependendo de sua velocidade. O problema é que as lesmas mais rápidas também se cansam mais rapidamente. Assim

Suponha que não existem lesmas que rastejam mais rapidamente que 100 cm/h.

Sua tarefa é identificar qual é a velocidade da lesma mais rápida que pode competir em uma maratona de uma certa duração.

Entrada

A entrada é composta de

5
12
9
8
7
6
3

Saída

A saída é uma única linha representando a velocidade da lesma mais rápida que pode competir. Nesse caso a saída é

9

pois a lesma mais rápida entre as que conseguem rastejar por 3h tem velocidade 9 cm/h.

Implementando

Guardando dados para usar depois

Para resolver essa tarefa, precisamos guardar todas as velocidades das lesmas na memória para podermos usar depois. Em Python, basta usarmos uma lista.

# guardamos as velocidades
velocidades = []
n = int(input())
for _ in range(n):
    v = int(input())
    velocidades.append(v)

No código acima, velocidades é uma lista. Repare que, quando criamos a variável velocidades, não sabíamos ainda o número de lesmas. Em Python, listas são conjuntos dinâmicos, isso é, eles podem crescer ou diminuir durante o tempo de execução! A linguagem C não possui um conjunto dinâmico como um tipo primitivo; assim, precisamos conhecer na hora em que estamos programando o maior número de elementos nosso conjunto pode conter. A maneira natural em C é declarar um vetor estático com um número máximo de posições disponíveis. Um vetor nada mais é do que um conjunto de variáveis do mesmo tipo acessadas usando um índice. Um código para guardar todas as velocidades seria:

#include <stdio.h>

int main() {
    int i, n;
    int velocidades[100];

    scanf("%d", &n);

    /* guardamos as velocidades */
    for (i = 0; i < n; i++) {
        scanf("%d", &velocidades[i]);
    }
}

Vamos estudar o código acima:

  1. A linha int velocidades[100] está criando 100 variáveis do tipo inteiro.
  2. A primeira posição do vetor é acessada com velocidades[0], a segunda com velocidades[1] etc.
  3. A última posição do vetor é acessada com velocidades[99].
  4. O conteúdo dentro dos colchetes pode ser uma variável, como velocidades[i], ou qualquer expressão inteira; por exemplo, velocidades[1 + 2] é a mesma coisa que velocidades[3].

É preciso ter MUITO CUIDADO ao utilizar vetores em C. Quando executamos o programa, a linguagem não realizará qualquer verificação para saber se o índice do vetor é válido. Assim, se durante a execução tivermos n igual a 3, então somente as 3 primeiras posições do vetor estarão inicializadas: velocidades[0], velocidades[1], velocidades[2]. Nesse caso, a posição velocidades[3] não estará inicializada e, se utilizarmos uma variável não inicializada, iremos obter um valor que não serve para nada!

Resolvendo o problema

Agora podemos ler a duração do evento requerida e resolver o problema. Repare que, para cada duração de evento, temos uma velocidade limite de lesmas. Por exemplo, se a duração de evento for 2 h, então uma lesma que rasteje a 21 cm/h não irá conseguir competir. Em Python, podemos facilmente completar o programa como segue

# descobrimos a velocidade limite para o evento
duracao = int(input())
if duracao == 1:
    limite = 100
elif duracao == 2:
    limite = 20
else:
    limite = 10

# calculamos a maior velocidade de lesmas qualificadas
maxima = 0
for v in velocidades:
    if v > maxima and v <= limite:
        maxima = v

# imprime maior velocidade
print(maxima)

Resolvendo o exercício

Complete agora o programa em C iniciado acima. Para isso você terá que acessar vetores utilizando os índices e terá que utilizar operadores booleanos em C.

Você pode começar com o código do template Maratona de lesmas

Exemplos relacionados

Se você quiser combinar duas condições, você usa a palavra-chave and ou a palavra-chave or em Python. Em C, esses operadores booleanos são escritos um pouco diferente: && significa E, ||significa OU.

#include <stdio.h>

int main() {
    float nota;
    float frequencia;

    scanf("%f %f", &nota, &frequencia);

    if (nota < 2.5 || frequencia < 0.75) {
        printf("estudante reprovou por nota ou frequencia\n");
    }
    if (nota >= 2.5 && frequencia >= 0.75) {
        printf("estudante pode realizar exame\n");
    }
}

Quando precisamos escrever uma mesma constante várias vezes, normalmete definimos uma macro com a diretiva #define como no código a seguir que calcula o IMC de várias pessoas:

#include <stdio.h>

#define MAX_PESSOAS 100

int main() {
    int i, n;
    float pesos[MAX_PESSOAS];
    float alturas[MAX_PESSOAS];

    scanf("%d", &n);

    for (i = 0; i < n; i++) {
        scanf("%f", &pesos[i]);
        scanf("%f", &alturas[i]);
    }

    for (i = 0; i < n; i++) {
        float imc = pesos[i] / (alturas[i]*alturas[i]);
        printf("%f\n", imc);
    }
}