O enunciado (que você encontra aqui) parece confuso na primeira leitura; felizmente os exemplos são mais claros. Tentando colocar de uma forma simples:
- Você precisa determinar qual o número mínimo de testes de carga a serem feitos em um site.
- Os testes são concluídos quando sabemos que o site suporta, dentro de um fator C, pelo menos P participantes ou uma quantidade X < P
- Suportar X participantes dentro de um fator C significa que você sabe que o site suporta uma carga a mas não uma carga a*C com a < P < a*C
- Inicialmente você sabe que o sistema suporta uma carga L mas não uma carga P.
Vamos considerar um dos exemplos do problema, no qual C=2, P=97 e L=24. Inicialmente sabemos que o site suporta até 47 participantes com fator 2 (pois 47 é o menor número menor que 2*24). Para termos certeza que o site suporta pelo menos 97 participantes com fator 2, precisamos testar com 49 (o menor número que multiplicado por 2 é maior que 97). Entretanto, se este teste for mal sucedido ainda não saberemos se o site suporta ou não 48 participantes. São precisos, portanto, dois testes.
Este exemplo sugere que os melhores pontos para teste são L*C, L*C*C, L*C*C*C, etc. É intuitivo que devemos primeiro tentar "no meio do caminho", usando um esquema parecido com a busca binária. Se L*C^(n-1) < P <= L*C^n, são precisos fazer, no pior caso, r = log2(n) (arredondado para cima se não for exato) casos.
Se ainda não ficou claro, veja a explicação oficial aqui.
A minha solução abaixo determina n e r "na marra". O meu erro na competição foi não reparar que L*C^n pode não caber em um inteiro de 32 bits. Na versão abaixo estou usando inteiro de 64 bits (o long long).
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- void main (void)
- {
- int iCase, nCases;
- int L, P, C;
- int n, r;
- long long prod;
- scanf ("%d\n", &nCases);
- for (iCase = 1; iCase <= nCases; iCase++)
- {
- scanf ("%d %d %d\n", &L, &P, &C);
- prod = L;
- n = 0;
- while (prod < (long long) P)
- {
- prod *= C;
- n++;
- }
- r = 0;
- prod = 1;
- while ((long long) n > prod)
- {
- prod = prod << 1;
- r++;
- }
- printf ("Case #%d: %d\n", iCase, r);
- }
- }
Nenhum comentário:
Postar um comentário