Solução Informática – Nível Iniciante – Semana 11

por

Solução por Anita Ramos

Para esse problema, utilizaremos algumas ideias de probabilidade, uma função além da $$int main()$$ e alguns comandos mais práticos, como o de potenciação $$pow(x,y) =$$ $$x^y$$ e o de retornar um número como $$double$$.

Iniciando a programação então, após adicionar a biblioteca, temos a função $$double vamp()$$ que, baseado em três inteiros, retorna a probabilidade do Vampiro 1 ganhar, ou seja, nos retorna a resposta do problema. Antes, porém, veremos o que ocorre na $$int main()$$.

Na $$int main()$$, o programa funciona enquanto existir casos de testes, sempre lendo a entrada e zerando as variáveis $$cont1$$ e $$cont2$$. Depois disso, ele calcula para cada um dos vampiros, em quantas rodadas ele morreria, independente do dado ou do oponente, apenas descontando o valor de $$D$$ constantemente e armazenando a resposta em $$cont1$$ e $$cont2$$. Por fim, aciona-se a função $$vamp()$$ baseado nos valores de $$cont1$$, $$cont2$$ e $$AT$$ e imprimi-se a resposta final gerada por essa função.

Voltando agora para a função $$vamp()$$, entenderemos como ela funciona. Inicialmente, se o limite do dado é 3, ele automaticamente retorna $$\frac{cont1}{cont1+cont2}$$, sempre em formato de double, imprimindo posteriormente como porcentagem. No entanto, se o limite do dado não é 3, $$d$$ recebe o valor de $$\frac{1 – (possibilidades do dado – at)}{possibilidades do dado}$$, ou seja, recebe o valor de $$1 – $$(probabilidade do vampiro 2 ganhar no dado). Depois, $$d$$ recebe o valor de $$\frac{1-d}{d}$$, ou seja, $$\frac{a probabilidade do vampiro 1 ganhar pelo dado}{probabilidade do vampiro 2 ganhar pelo dado}$$. Por fim, retorna-se o valor da possibilidade do vampiro 1 ganhar, baseando na divisão de 1 – d^(qntd de rodadas para perder pela subtração de D) por 1 – d^(c1+c2), sendo o denominador, o total de possibilidades gerais.

Segue o código comentado para melhor compreensão da solução:


#include <bits/stdc++.h> // biblioteca utilizada
using namespace std;
double vamp(int c1, int c2, int at)
{
double d; // declaro 'd' como double
if(at == 3) return (double)c1/(double)(c1 + c2); // se o valor do dado referência for 3, //retorna 'c1/(c1+c2)' no formato double
else //se não
{
d=1.0-(6 – at)/6.0; // 'd' recebe '1-(6-at)/6'
d=(1-d)/d; // 'd' recebe '(1-d)/d'
return (1.0-pow(d,c1))/(1.0-pow(d,c1+c2)); // retorna '(1-d^c1)/(1-d^c1+c2)'
}
}
int main()
{
int EV1, EV2, AT, D; // declaro as variáveis principais
double prob; //declaro 'prob' como double
while(scanf("%d %d %d %d", &EV1, &EV2, &AT, &D) && (EV1 || EV2 || AT || D)) // enquanto existir testes
{
int cont1=0, cont2=0; // 'cont1' e 'cont2' zeram
for(int i=EV1; i>0; i-=D)cont1++; // enquanto 'i' não zera, desconta-se o valor de 'D' dele e soma-se 1 em 'cont1'
for(int i=EV2; i>0; i-=D)cont2++; // enquanto 'i' não zera, desconta-se o valor de 'D' dele e soma-se 1 em 'cont2'
prob = vamp(cont1, cont2, AT); // chamo a função vamp de (cont1, cont2, AT)
printf("%.1f\n", prob*100); // imprimo a probabilidade em porcentagem com 1 casa decimal
}
return 0; //retorna a 0
}

view raw

Vampiros.cpp

hosted with ❤ by GitHub