Solução por Anita Ramos
Para esse problema, utilizaremos algumas ideias de probabilidade, uma função além da e alguns comandos mais práticos, como o de potenciação e o de retornar um número como .
Iniciando a programação então, após adicionar a biblioteca, temos a função 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 .
Na , o programa funciona enquanto existir casos de testes, sempre lendo a entrada e zerando as variáveis e . 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 constantemente e armazenando a resposta em e . Por fim, aciona-se a função baseado nos valores de , e e imprimi-se a resposta final gerada por essa função.
Voltando agora para a função , entenderemos como ela funciona. Inicialmente, se o limite do dado é 3, ele automaticamente retorna , sempre em formato de double, imprimindo posteriormente como porcentagem. No entanto, se o limite do dado não é 3, recebe o valor de , ou seja, recebe o valor de (probabilidade do vampiro 2 ganhar no dado). Depois, recebe o valor de , ou seja, . 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:
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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 | |
} |