OBI 2021 - Fase 2 Turno B - Programação Nível Júnior
Para se preparar para a OBI, confira o nosso Roteiro de Estudos, nele você vai encontrar um direcionamento completo de como estudar!
Comentário escrito por Anita Almeida, Leonardo Paes e Lúcio Figueiredo
Para conferir a prova na íntegra, clique aqui.
Recorde
Conhecimento prévio necessário:
Este problema é bem simples e utiliza apenas a estrutura condicional . Após ler os valores, basta comparar se é menor que para determinar se é um recorde mundial, e se é menor que para determinar se é um recorde olímpico. Se nenhum dois casos for verdade, basta imprimir .
A complexidade da solução é . Segue o código para melhor compreensão da solução:
Anagrama
Conhecimento prévio necessário:
Para resolvermos o problema, basta considerarmos as letras dadas nas strings. Como dito no próprio enunciado, devemos ignorar as vírgulas e os pontos. Para que a frase seja um anagrama da frase , é necessário e suficiente que a frequência de cada letra do alfabeto seja a mesma em ambas as frases. Por exemplo, se na frase a letra aparece vezes, na frase a letra também deve aparecer 3 vezes. Assim, podemos utilizar um vetor que armazena a frequência de cada letra em uma das strings, e em seguida conferir se tais frequências são idênticas às frequências de cada letra na outra string. Se sim, as frases são anagramas.
Para provarmos tal afirmação, basta supor, por absurdo, que há uma quantidade diferente de uma letra arbitrária em cada frase. Suponha por absurdo que na frase haja vezes o caractere , e na frase haja vezes o caractere , . Isso implica que ou ou . Suponhamos sem perda de generalidade que . Então, para formarmos a frase a partir da frase , trocando a ordem dos caracteres de , conseguiremos colocar somente caracteres em suas respectivas posições na frase , o que implica que ainda precisaríamos de caracteres para completar a frase . Portanto, a afirmação de que as frequências de cada letra do alfabeto devem ser iguais em ambas as frases está provada por absurdo.
A complexidade final é . Confira o código abaixo para melhor entendimento:
Potência
Conhecimento prévio necessário:
- Estruturas Condicionais
- Loops
- Apenas por curiosidade, Congruências
Como dito pelo enunciado do problema, a potência é composta por um único dígito. Então, supomos que estamos lendo um inteiro . Sabemos que na verdade, queremos . Portanto, uma maneira simples de fazer isso é a seguinte: Após lermos o inteiro , utilizaremos a função %, que nos retornará o número módulo , ou seja, o resto na divisão por do número em questão. Note que esse valor sempre será o último dígito do número, ou seja, o dígito das unidades. Valor este que representa a potência do nosso termo. Para eliminarmos o último dígito do número, podemos dividí-lo por 10 e tomar a parte inteira da operação. Em C++, , já que o operador obtém a parte inteira da divisão. Essa operação faz exatamente o que nós precisamos.
A complexidade da solução é . Confira o código abaixo para melhor entendimento:
PS.: Caso deseje ver uma explicação detalhada das operações realizadas acima, clique aqui para conferir a solução do problema Cálculo rápido, da prova do nível P1.
Pesquisa de preços
Conhecimento prévio necessário:
Sejam e os preços do litro de álcool e gasolina de um estado, respectivamente. Pela definição dada no enunciado, é vantajoso utilizar o álcool quando . Portanto, para checar se é vantajoso utilizar álcool em um dos estados fornecidos na entrada, basta checarmos se a desigualdade obtida é verdadeira, utilizando a estrutura condicional If. Se a desigualdade for verdadeira, imprimimos a sigla do estado na saída.
Porém, precisamos nos atentar a um pequeno detalhe: se não for vantajoso utilizar álcool em nenhum dos estados, devemos imprimir o caractere na saída. Para conferir este caso, utilizaremos uma variável booleana , declarada inicialmente com o valor . Se em algum dos estados fornecidos for vantajoso utilizar álcool, atribuímos o valor à variável . Desta forma, ao fim da leitura dos estados, basta checarmos se ; se sim, imprimimos o caractere na saída.
Como realizamos operações constantes para cada um dos estados, a complexidade final da solução é . Confira o código abaixo para melhor entendimento: