Матч 253, Упаковка объектов (ObjectPacking)

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

 

Имеется несколько коробок прямоугольной формы. Ширина i - ой коробки задается в ячейке boxWidth[i], длина – в boxLength[i]. Задан объект прямоугольной формы, ширина которого равна objWidth, а длина objLength. Необходимо найти коробку с наименьшей площадью, в которую можно поместить объект. Объект можно вращать на 0, 90, 180 или 270 градусов.

 

Класс: ObjectPacking

Метод: int smallBox(int objWidth, int objLength,

                    vector<int> boxWidth, vector<int> boxLength)

Ограничения: boxWidth и boxLength имеют одинаковую длину и содержат от 1 до 50 чисел, 1 £ objWidth[i], objLength[i], objWidth, objLength  £ 1000.

 

Вход. Целые числа objWidth и objLength – размеры объекта, массивы boxWidth и boxLength, содержащие размеры коробок.

 

Выход. Наименьшая площадь коробки, в которую можно поместить объект. Если объект нельзя поместить ни в одну из имеющихся коробок, вернуть -1.

 

Пример входа

objWidth

objLength

boxWidth

boxLength

7

3

{3}

{7}

5

8

{6,9,3}

{7,4,5}

17

5

{19,10,12,40}

{12,20,15,5}

1

10

{9,1,10}

{10,6,4}

 

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

21

-1

200

40

 

 

РЕШЕНИЕ

элементарные вычисления

 

Пусть ширина текущей коробки равна W, длина – L. Объект с размерами objWidth и objLength можно поместить в коробку, если выполняется условие

(W >= objWidth) && (L >= objLength)

или

(W >= objLength ) && (L >= objWidth)

Перебираем все коробки, проверяем, можно ли в них поместить имеющийся объект. Если можно – то вычисляем площадь коробки. Находим наименьшую площадь такой коробки.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

class ObjectPacking

{

public:

  int smallBox(int objWidth, int objLength, vector<int> boxWidth,

               vector<int> boxLength)

  {

    int W, L, i, res = 1000000000; 

    for(i = 0; i < boxWidth.size(); i++)

    {

      W = boxWidth[i]; L = boxLength[i];

      if (((W >= objWidth) && (L >= objLength)) ||

          ((W >= objLength ) && (L >= objWidth)))

        if (W * L < res) res = W * L;

    }

    return (res == 1000000000) ? -1 : res;

  }

};