O
Henrique está a tomar banho em casa dos avós. A temperatura da
água é regulada por uma torneira com números inteiros de 1 a N,
por ordem crescente de calor. O Henrique lembra-se que que um
destes inteiros corresponde à temperatura perfeita, mas não se
lembra qual. O Henrique muda a temperatura da água uma vez por
segundo, e o Henrique sabe dizer se a água está demasiado fria,
quente, ou ideal. No entanto, a temperatura demora K segundos a
atualizar, pelo que ele só sabe a qualidade da temperatura
selecionada no segundo t depois do segundo t+K.
O Henrique não pode ficar o tempo todo no banho, pelo que só tem Q segundos para encontrar a temperatura ideal. Como antigo concorrente das ONI, ele suspeita que deve haver um bom algoritmo para encontrar a temperatura ideal o mais depressa possível. Consegues ajuda-lo?
Podes começar por descarregar os ficheiros correspondentes à tua linguagem (ou um arquivo zip contendo tudo):
Linguagem | Ficheiro a implementar | Ficheiro com avaliador exemplo | Ficheiros auxiliares | Input para avaliador exemplo |
C++ | resolver.cpp | avaliador.cpp | avaliador.h | input.txt |
Deves submeter um único ficheiro que implementa uma função:
resolver(N, K, Q)
, que recebe um
inteiro N, que representa o número de temperaturas, um
inteiro K, que representa o atraso na atualização de
uma temperatura, e um inteiro Q, o número de segundos
disponíveis. A função deve devolver um inteiro representando a
temperatura ideal.
Nota: No avaliador oficial a função resolver será chamada várias vezes na mesma execução (até um máximo de 10,000 vezes). Se alguma das chamadas devolver o valor errado ou usar mais perguntas do que as permitidas, a resposta será considerada incorreta.
Para isso deves usar o ficheiro resolver.cpp que descarregaste, colocando no interior das funções o teu código. Podes acrescentar outras funções, mas devem ficar todas neste ficheiro que é o único que deves submeter.
Funções a implementar:
C++: | int resolver(int N, int K, int Q); |
A tua função deve invocar as seguinte função:
pergunta(temp)
, que recebe um inteiro
entre 1 e N representando uma temperatura e devolve um
inteiro. O valor de retorno é a resposta atrasada, ou seja,
será a resposta à K-ésima pergunta anterior. Para as
primeiras K perguntas é devolvido o valor -2, indicando
que não há ainda nenhum resultado. A partir dai, a função
devolve a resposta da K-ésima pergunta anterior no
seguinte formato:
Nota que é importante que temp esteja entre 1 e N. Também é importante notar que se excederes o número de perguntas permitidas (ver limites) o programa será interrompido e a resposta será considerada incorreta.
Funções do avaliador:
C++: | int pergunta(int temp); |
A vossa função não deve ler nem escrever para os canais de entrada/saída padrão.
Considera N = 10, K = 2 e Q = 12. A função resolver
que deves
implementar será chamada como resolver(10, 2, 12)
.
Uma possível execução seria a seguinte (com a ordem das chamadas a ser de cima para baixo):
Invocação | Resultado | Descrição |
pergunta(10) | -2 | Não temos informação ainda. |
pergunta(3) | -2 | Não temos informação ainda. |
pergunta(7) | -1 | 10 é demasiado quente. |
pergunta(9) | 1 | 3 é demasiado frio. |
pergunta(6) | 0 | 7 é a temperatura ideal. |
devolve 7 | - |
1 ≤ N ≤ 108 | Número de temperaturas. | |
0 ≤ K ≤ 50 | Tempo de atraso. |
Os casos de teste deste problema estarão agrupados em conjuntos de testes. Ao contrário dos restantes problemas, para obter pontuação é necessário acertar todos os casos de teste de um grupo de casos, nesse caso terão a pontuação completa relativa a esse grupo. Se falharem um ou mais casos de um grupo, a pontuação atribuída relativa a esse grupo será nula.
Cada grupo tem um número de pontos associado e um conjunto de restrições adicionais. Os grupos são os seguintes:
Grupo | Número de Pontos | Restrições adicionais |
---|---|---|
1 | 10 | K = 10, Q = 480 |
2 | 20 | K = 2, Q = 60 |
3 | 20 | K = 1, Q = 45 |
4 | 25 | K = 30, Q = 480 |
5 | 25 | K = 50, Q = 480 |
É disponibilizado um avaliador exemplo (avaliador.cpp) que pode ser utilizado para testar a vossa submissão. Está ainda disponível um ficheiro auxiliar (avaliador.h). Este avaliador não corresponde ao utilizado pelo sistema de avaliação.
Este avaliador receber como input quatro inteiros: N, K, Q e a temperatura ideal.
O avaliador irá automaticamente invocar a
função resolver(N, K, Q)
por vocês implementada e
indicará se a resposta foi correta. O avaliador indicará ainda o
número de perguntas efetuadas.
Disponibilizamos um ficheiro input.txt que contém o caso de exemplo referido acima.
Um exemplo de teste na tua máquina (supondo que tens os compiladores oficiais instalados) seria o seguinte:
Linguagem | Compilar | Executar com o exemplo |
C++ | g++ -Wall -std=gnu++14 avaliador.cpp resolver.cpp | ./a.out < input.txt |