Comentário por Lúcio Cardoso
Para conferir a prova na íntegra, clique aqui.
Idade de Dona Mônica
Conhecimento prévio necessário:
Seja a idade do terceiro filho. Note que , e logo, . Assim, o nosso programa deve imprimir o máximo dentre e . Para isso, utilizaremos a função max() do C++.
Complexidade: .
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Comentário Noic OBI 2019 - Fase 1 - Programação Nível 1 | |
// Idade de Dona Mônica | |
#include <bits/stdc++.h> | |
using namespace std; | |
int main(void) | |
{ | |
int m, a, b; | |
cin >> m >> a >> b; | |
int c = m-a-b; | |
// maximo dentre a, b, e c | |
cout << max(a, max(b, c)) << "\n"; | |
} |
Nota Cortada
Conhecimento Prévio Necessário:
- Estruturas Condicionais
- Área do Trapézio
Perceba que os dois pedaços resultantes do corte terão o formato de um trapézio. Assim, lembrando que a área de um trápezio de altura e bases é , teremos que a área da figura mais à esquerda será igual a . Tendo isso em mente, podemos agora simplesmente checar se a área resultante é maior, igual ou menor que metade da área do retângulo, imprimindo, assim, as respectivas respostas.
Complexidade: .
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Comentário Noic OBI 2019 - Fase 1 - Programação Nível 1 | |
// Nota Cortada | |
#include <bits/stdc++.h> | |
using namespace std; | |
int main(void) | |
{ | |
int B, T; | |
cin >> B >> T; | |
// metade da área do retângulo | |
int metade = (70*160)/2; | |
// área do lado esquerdo | |
int area = (70*(B+T))/2; | |
if (area == metade) cout << "0\n"; | |
else if (area > metade) cout << "1\n"; | |
else cout << "2\n"; | |
} |
Jogo de Dominós
Conhecimento prévio necessário:
- Entrada e Saída
- Matemática Básica
Fato 1: O valor da soma , para um inteiro, é igual a .
Seja a quantidade de peças em que um lados tem valor e o outro lado possui um valor menor ou igual a . É fácil notar que o total de peças em um jogo duplo- será igual a . Além disso, podemos notar que , já que a quantidade de valores não-negativos menores ou iguais a é . Assim, a resposta do nosso problema é , e pelo Fato 1, sabemos que esta soma possui valor igual a .
Note que o Fato 1 não era necessário para resolver o problema: Poderíamos resolvê-lo usando simplesmente um loop que soma os valores de a em uma variável que guarda a resposta, com complexidade .
Complexidade: ou .
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Comentário Noic OBI 2019 - Fase 1 - Programação Nível 1 | |
// Jogo de Dominós | |
#include <bits/stdc++.h> | |
using namespace std; | |
int main(void) | |
{ | |
int n; | |
cin >> n; | |
// 1 + 2 + ... + (N+1) | |
cout << ((n+1)*(n+2))/2 << "\n"; | |
} |
Distância entre amigos
Conhecimento prévio necessário:
Seja a quantidade de andares no -ésimo prédio. Pela descrição do problema, temos que a distância entre dois apartamentos e (com ) é igual a . Vamos, então, descobrir para cada prédio () a maior distância distância possível para algum prédio com índice menor que . Pela expressão obtida anteriormente, é fácil notar que o prédio que dará a maior distância para o prédio é aquele com valor máximo, já que e são valores que independem da escolha de .
Logo, podemos iterar por cada prédio de a , e, ao mesmo tempo, usar uma variável que guarda o maior valor encontrado até a iteração atual. Assim, a resposta do problema será o valor máximo de , para .
Complexidade: .
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Comentário Noic OBI 2019 - Fase 1 - Programação Nível 1 | |
// Distância entre amigos | |
#include <bits/stdc++.h> | |
// valor "infinito" | |
const int inf = 1e9+10; | |
using namespace std; | |
int main(void) | |
{ | |
int n; | |
cin >> n; | |
// inicialmente, maior começa com um valor menor que | |
// o mínimo valor possível | |
int maior = -inf; | |
// resposta do problema | |
int ans = -inf; | |
for (int i = 1; i <= n; i++) | |
{ | |
// altura do i-ésimo prédio | |
int h; | |
cin >> h; | |
// atualizamos a resposta | |
ans = max(ans, h+i+maior); | |
// atualizamos o maior valor (H(i)-i) | |
maior = max(maior, h-i); | |
} | |
cout << ans << "\n"; | |
} |