Матч 334, Скидка в супермаркете (SupermarketDiscount)

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

 

Три девочки пришли в супермаркет. На кассе они увидели рекламу: “Купите товара на  50$ и получите скидку в 10$”. Девочки поняли, что иногда выгодно объединить их покупки, нежели платить отдельно. Например, если суммы их покупок составляют соответственно 46$, 62$ и 9$, то объединив товары в две покупки за 55$ и 62$, они получат скидку в 20$.

Массив goods содержит стоимости покупок трех девочек. Необходимо определить наименьшую сумму, которой они могут рассчитаться за товар.

 

Класс: SupermarketDiscount

Метод: int minAmount(vector<int> goods)

Ограничения: goods содержит в точности 3 числа от 1 до 99.

 

Вход. Массив goods из 3 натуральных чисел.

 

Выход. Наименьшая сумма, которую могут заплатить девочки за приобретаемый товар, кооперируясь между собой при его оплате.

 

Пример входа

goods

{46, 62, 9}

{50, 62, 93}

{5, 3, 15}

 

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

97

175

23

 

 

РЕШЕНИЕ

полный перебор

 

Функция disc возвращает стоимость товара со скидкой. Кооперироваться при оплате девочки могут одним из следующих образов:

1. За весь товар платит одна девочка.

2. Двое девочек объединяют товар в одну покупку, а третья платит за себя.

3. Все три девочки платят отдельно.

Перебрав все описанные варианты и посчитав сумму оплаты, возвращаем вариант с наименьшей суммой.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

using namespace std;

 

int disc(int n)

{

  return (n >= 50) ? n - 10 : n;

}

 

class SupermarketDiscount

{

public:

  int minAmount(vector<int> goods)

  {

    int res = disc(goods[0]) + disc(goods[1]) + disc(goods[2]);

    res = min(res,disc(goods[0] + goods[1]) + disc(goods[2]));

    res = min(res,disc(goods[0] + goods[2]) + disc(goods[1]));

    res = min(res,disc(goods[1] + goods[2]) + disc(goods[0]));

    res = min(res,disc(goods[0] + goods[1] + goods[2]));

    return res;

  }

};