- O "estalador" (snapper) é um interruptor que, quando alimentado, muda de estado entre ligado e desligado quando alguém estala os dedos.
- "N" estaladores são ligados em série. O primeiro é ligado na tomada e o último a uma lâmpada.
- O problema consiste em determinar se a lâmpada estará acesa ou apagada após "K" estalos.
O meu primeiro passo para a solução foi observar que na verdade cada estalador tem dois estados: alimentado ou não e ligado ou desligado. O estado ligado ou desligado só muda com um estalo se o estalador estiver alimentado, o que corresponde a todos os anteriores estarem ligados.
Simulando um pouco na mão, dá para perceber que a cadeia de estaladores corresponde a um contador binário. Após "K" estalos, o estado ligado/desligado da cadeia corresponde a "K" em binário (mais precisamente, K módulo 2^N). Todos os estaladores ligados corresponde a todos os bits em "1".
Meu algorítimo consiste, portanto, em testar se "K" tem os "N" bits menos significativos em "1". O tempo de execução depende apenas de "N" (cujo valor máximo é 30).
O código é o seguinte:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define FALSE 0
#define TRUE 1
void main (void)
{
int iCase, nCases;
int N, K;
int lOn, i, msk;
scanf ("%d\n", &nCases);
for (iCase = 1; iCase <= nCases; iCase++)
{
scanf ("%d %d\n", &N, &K);
lOn = FALSE;
msk = 1;
for (i = 0; i < N; i++)
{
if ((K & msk) == 0)
{
lOn = FALSE;
break;
}
lOn = TRUE;
msk <<= 1;
}
printf ("Case #%d: %s\n", iCase, lOn ? "ON" : "OFF");
}
}
Nenhum comentário:
Postar um comentário