Матч 433, Королевское сокровище (RoyalTreasurer)

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

 

Массивы a и b содержат одинаковое количество неотрицательных целых чисел. Рассмотрим сумму

S = a0 * b0 + a1 * b1 + … + an-1 * bn-1

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

 

Класс: RoyalTreasurer

Метод: int minimalArrangement(vector<int> a, vector<int> b)

Ограничения: а и b содержат одинаковое количество элементов, от 1 до 50, 0 £ a[i], b[i] £ 100.

 

Вход. Массивы неотрицательных целых чисел a и b.

 

Выход. Наименьшее возможное значение суммы S.

 

Пример входа

a

b

{1,1,3}

{10,30,20}

{1,1,1,6,0}

{2,7,8,3,1}

{5,15,100,31,39,0,0,3,26}

{11,12,13,2,3,4,5,9,1}

 

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

80

18

528

 

 

РЕШЕНИЕ

сортировка

 

Отсортируем элементы массива а по возрастанию, а b – по убыванию. Скалярное произведение векторов a и b является искомой наименьшей суммой. Очевидно, что это же значение можно получить переставляя только элементы массива а, сопоставив наименьший элемент массива а наибольшему элементу из b, второй наименьший элемент  массива а второму наибольшему элементу из b, и так далее.

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <algorithm>

#include <set>

#include <numeric>

using namespace std;

 

class RoyalTreasurer

{

public:

  int minimalArrangement(vector<int> a, vector<int> b)

  {

    sort(a.begin(),a.end()); sort(b.begin(),b.end(),greater<int>());

    return inner_product(a.begin(),a.end(),b.begin(),0);

  }

};