Матч 284, Загрузка грузовика (Truckloads)

Дивизион 2, Уровень 1

 

Имеется кипа из numCrates корзин. Ее следует загрузить в машины, вместительность каждой из которых равна loadSize. Если кипа имеет размер, больший loadSize, то она делится пополам и каждую из частей рекурсивно грузят в машины. Если размер кипы нечетный (numCrates = 2n + 1), то при ее делении пополам в одной кипе окажется n корзин , а в другой n + 1. Сколько потребуется машин, чтобы загрузить все numCrates корзин?

 

Класс: Truckloads

Метод: int numTrucks(int numCrates, int loadSize)

Ограничения: 2 £ numCrates £ 10000, 1 £ loadSize £ numCrates – 1.

 

Вход. Количество корзин numCrates в кипе и вместительность машин loadSize.

 

Выход. Количество машин, требуемое для погрузки всех numCrates корзин.

 

Пример входа

numCrates

loadSize

14

3

15

1

1024

5

 

Пример выхода

6

15

256

 

РЕШЕНИЕ

рекурсия

 

Задача решается рекурсивным подсчетом числа машин. Если numCrates £ loadSize, то достаточно одной машины. Иначе кипа делится на две части с размерами numCrates / 2 и (numCrates + 1) / 2, после чего рекурсивно распределяется между машинами. Деление на 2 в этих выражениях целочисленное. Поэтому если numCrates четно , то numCrates / 2 = (numCrates + 1) / 2. Если numCrates нечетно, то numCrates / 2 +1 = (numCrates + 1) / 2 (размер полученных кип отличается на единицу).

 

ПРОГРАММА

 

#include <stdio.h>

 

class Truckloads

{

public:

  int numTrucks(int numCrates, int loadSize)

  {

    return (numCrates <= loadSize) ? 1 : numTrucks(numCrates / 2, loadSize) +

            numTrucks((numCrates + 1) / 2, loadSize);

  }

};