Матч
180, Нарядная рыба (DinkyFish)
Дивизион 2, Уровень
1
В аквариуме объемом tankVolume литров живет maleNum самцов и femaleNum самок рыб. После рождения каждый самец выбирает самку, от
которой каждый месяц производится потомство в одного самца и одну самку. На
каждую рыбу требуется пол-литра воды. Если в аквариуме воды станет меньше, чем
требуется на имеющееся количество рыб, то аквариум считается переполненным.
Вычислить, через какое количество месяцев аквариум станет переполненным. Если
аквариум является переполненным при входных данных, то вывести 0.
Класс: DinkyFish
Метод: int
monthsUntilCrowded(int tankVolume, int maleNum,
int femaleNum)
Ограничения:
1 £ tankVolume £ 106, 1 £ maleNum, femaleNum £ 1000.
Вход. Размер аквариума tankVolume, изначальное
количество самцов maleNum и самок femaleNum.
Выход. Количество месяцев, через которое аквариум будет переполненным.
Пример входа
tankVolume |
maleNum |
femaleNum |
10 |
4 |
6 |
100 |
4 |
6 |
5 |
6 |
4 |
4 |
6 |
4 |
Пример выхода
2
5
1
0
РЕШЕНИЕ
элементарные вычисления
Каждый месяц inc = min(maleNum, femaleNum) пар дают потомство. Увеличиваем каждый месяц число самок и
самцов на inc, проверяя условие переполненности аквариума: maleNum + femaleNum
> 2 * tankVolume (на каждую рыбку должно приходиться
не менее пол-литра воды). Подсчитываем число месяцев, которое пройдет до
переполнения аквариума.
ПРОГРАММА
#include <stdio.h>
class DinkyFish
{
public:
int monthsUntilCrowded(int
tankVolume, int maleNum, int femaleNum)
{
if (maleNum + femaleNum > 2 *
tankVolume) return 0;
int inc = (maleNum < femaleNum) ?
maleNum : femaleNum;
return 1 +
monthsUntilCrowded(tankVolume, maleNum + inc, femaleNum + inc);
}
};