OBI 2024 - Fase 2 - Programação Nível 1
Se você quiser se preparar para a OBI, não deixe de conferir o Roteiro de estudos de informática, e também a página de informática do NOIC, com todos nossos materiais.
Avenida
Comentário por Henrique Vianna
Perceba que há duas rotas que podem ser escolhidas:
- Ir ao último ponto de ônibus anterior à escola e andar o que faltar, ou seja, metros.
- Ir ao primeiro ponto de ônibus posterior à escola e "voltar" andando, ou seja, metros.
Portanto, a distância mínima que Luiza precisará andar será simplesmente o mínimo entre esses dois valores.
Segue o código:
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
#include <bits/stdc++.h> | |
using namespace std; | |
int main() | |
{ | |
int d; cin >> d; | |
cout << min(d % 400, 400 - d % 400) << '\n'; | |
} |
Alfabeto
Comentário por Murilo Maeda Kataoka
Conhecimento necessário
Para esse problema, só precisamos de uma estrutura que seja capaz de nos dizer se um certo caracter está ou não no alfabeto. Uma estrutura que faz exatamente isso é o map, da STL do C++. Com ele, basta passarmos pelos caracteres do alfabeto alienígena e marcar . Depois, quando estivermos passando pela mensagem, basta ver se o map do caracter em questão foi ou não ativado.
Segue o código:
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
#include<bits/stdc++.h> | |
using namespace std; | |
int main() | |
{ | |
cin.tie(0)->sync_with_stdio(0); | |
int N,K; cin >> N >> K; | |
string alfabeto, mensagem; cin >> alfabeto >> mensagem; | |
map<char,bool> marc; | |
for(char cur : alfabeto) | |
{ | |
marc[cur] = true; | |
} | |
bool eh = true; | |
for(char cur : mensagem) | |
{ | |
if(!marc[cur]) | |
eh = false; | |
} | |
if(eh) cout << "S\n"; | |
else cout << "N\n"; | |
} |
Dança de Formatura
Comentário por Henrique Vianna
Conhecimento prévio necessário:
Perceba que o número do aluno na linha e coluna é dado por inicialmente. Analisando essa "fórmula", percebe-se que quando ocorre a troca de duas linhas, mudamos apenas o valor pelo qual é multiplicado. De forma análoga, quando ocorre a troca de duas colunas, há uma alteração apenas na constante (inicialmente ) que somamos. Então, basta mantermos, para cada linha, o valor , pelo qual devemos multiplicar e, para cada coluna, a constante que devemos somar. Inicialmente, temos para todo e para todo . Numa operação, basta darmos um swap nos valores em questão. Ao final, basta imprimirmos para cada posição .
Segue o código:
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
#include <bits/stdc++.h> | |
using namespace std; | |
int32_t main(void) | |
{ | |
ios_base::sync_with_stdio(false); | |
cin.tie(NULL); | |
int n, m, q; cin >> n >> m >> q; | |
vector<int> x(n + 1), y(m + 1); | |
iota(x.begin(), x.end(), 0); | |
iota(y.begin(), y.end(), 0); | |
while(q--) | |
{ | |
char op; cin >> op; | |
int a, b; cin >> a >> b; | |
if(op == 'L') swap(x[a], x[b]); | |
else swap(y[a], y[b]); | |
} | |
for(int i = 1; i <= n; i++) | |
{ | |
for(int j = 1; j <= m; j++) | |
cout << (x[i] - 1) * m + y[j] << ' '; | |
cout << '\n'; | |
} | |
} |
Concatena Dígitos
Escrito por Caique Paiva
Conhecimentos Prévios Necessários:
Vamos chegar em uma fórmula para resolver a pergunta . Seja o i-ésimo dígito. Veja um número entre , tem duas possibilidades para ele:
- Ele pode ser um algarismo da dezena, ou seja, ele contribui a soma total com . E caso eu escolha esse número para ser o da dezena, temos possibilidades de números para as unidades (Quantidade de números entre e , sem contar o próprio ), portanto, temos números com sendo a dezena. Portanto, esse caso adiciona nesse caso.
- Agora, esse mesmo número também pode ser um algarismo da unidade, ou seja, ele contribui a soma total com . Pelo mesmo argumento acima, temos números com sendo a unidade. Portanto, esse cado adiciona .
Portanto, somando esses dois casos, para cada , eles contribuem na resposta o valor . Fazendo isso para todo entre , temos que a resposta de uma query é . Agora, usando a técnica de soma de prefixos, faça , e então, a resposta para query é , e conseguimos responder essa query em .