Solução por Rogério Júnior
A grande dificuldade do problema é o fato de os números envolvidos ficarem muito grandes, estourando os valores de int e de long long int. Porém, podemos comparar se um número é maior que o outro apenas pelos seus logaritmos, que são bem menores que os números originais. Existe uma função da cmath chamada double log(double x) que recebe uma double como parâmetro e retorna o valor de seu logaritmo natural (como outra double).
Note que a quantidade de bactéria formadas por uma colônia que irá durar por C dias, onde cada bactéria irá gerar outras D descendentes é exatamente , pois a cada dia a população será multiplicada por D (cada bactéria terá D filhos) e esse processo irá se repetir exatamente C vezes. Logo, basta encontrarmos o maior valor de log(DC) = C*log(D). Para isso basta percorrermos toda a entrada, guardando o valor do log da maior colônia já encontrada em maior. Toda vez que encontrarmos uma colônia que terá mais bactérias que a salva, guardamos seu id (identificação da colônia) e atualizamos o valor de maior para o log da sua quantidade de bactérias. Após lermos a entrada, basta imprimirmos o valor salvo em maior. Seguem o código adaptado e os comentários do nosso leitor Roger Benet, que conseguiu resolver o problema em C++. Note que ele chama de max_atual a nossa variável maior.
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 <cstdio> | |
#include <math.h> // biblioteca para usar a função log10 | |
/* | |
Para resolver este problema basta encontrar um meio | |
de comparar valores que em tese podem ser muito altos, | |
como por exemplo : 2000 ^ 5000; Esta comparação pode ser | |
feita usando logaritmos, visto que o maior | |
valor obtido com uso de log é : log(2000) ^ 5000 = 5000 * log(2000) = 16505.1499783; | |
*/ | |
int n,id; | |
double max_atual,d,c,res; // maxi é iniciada com 0.0; perceba que as variáveis devem ser do tipo double | |
int main() { | |
scanf("%d", &n); | |
for(int i = 0; i < n; i++){ | |
scanf("%lf %lf", &d, &c); | |
res = c * log10(d); | |
// comparo se o novo resultado é maior que max_atual | |
// se for, a varivel id recebe o numero da nova bactéria | |
if(res > max_atual){ | |
max_atual = res; | |
id = i; | |
} | |
} | |
printf("%d\n",id); | |
return 0; | |
} |