Problema D - Regular a Temperatura

Este é um problema de interação.
Ao contrário dos outros problemas em que deves fazer leitura de dados e escrita do output, neste problema deves interagir com o avaliador através da implementação de uma função e da interação com as funções fornecidas.

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?

Ficheiros para Download

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

Implementação

Deves submeter um único ficheiro que implementa uma função:

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:

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.

Exemplo

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çãoResultadoDescrição
pergunta(10)-2Não temos informação ainda.
pergunta(3)-2Não temos informação ainda.
pergunta(7)-110 é demasiado quente.
pergunta(9)13 é demasiado frio.
pergunta(6)07 é a temperatura ideal.
devolve 7-

Restrições

São garantidos os seguintes limites em todos os casos de teste:
1 ≤ N ≤ 108Número de temperaturas.
0 ≤ K ≤ 50Tempo de atraso.

Avaliação e Casos de Teste

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

Testes no vosso computador

É 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:

LinguagemCompilarExecutar com o exemplo
C++g++ -Wall -std=gnu++14 avaliador.cpp resolver.cpp./a.out < input.txt

Prova de Seleção para as IOI'2021
Prova Online
(3 de Junho de 2021)