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

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