Solução Feira de Bactérias

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 D^C, 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.


#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;
}

view raw

feira.cpp

hosted with ❤ by GitHub