Матч 322, Групповая работа (GroupWork)

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

 

Имеются группы людей, которые выполняют работу с определенной производительностью В i - ой группе находится p[i] людей, уровень производительности каждого человека этой группы равен s[i].

Продуктивность работы группы из k человек равна k * x, где x – наименьший уровень производительности у человека из этой группы. Имея размеры групп p и производительности людей в группах s, необходимо составить такую группу, продуктивность работы которой будет наибольшей.

 

Класс: GroupWork

Метод: long long bestGroup(vector<int> p, vector<int> s)

Ограничения: p содержит от 1 до 50 элементов, s и p содержат одинаковое количество элементов, 1 £ p[i] £ 109, 1 £ s £ 1000.

 

Вход. Массив размеров групп людей p и массив уровней мастерства s.

 

Выход. n - ая разность последовательности a.

 

Пример входа

p

s

{1,2,1}

{3,5,9}

{2,2,2,2}

{5,1,1,5}

{1000000000,1000000000,1000000000}

{1000,999,998}

 

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

15

20

2994000000000

 

 

РЕШЕНИЕ

жадный алгоритм

 

Составим вектор v пар (s[i], p[i]) и отсортируем его по убыванию производительности, то есть по первой компоненте. Будем последовательно включать в рабочую группу людей по убыванию их производительности. Для каждой текущей группы ищем ее продуктивность работы, и среди всех продуктивностей находим наибольшую.

Пусть (s[0], p[0]), (s[1], p[1]), …, (s[n], p[n])   – вектор v, отсортированный по убыванию первой компоненты. i - ой будем называть группу, состоящую из p[0] + p[1] + … + p[i] людей, 0 £ i £ v.size(). Наименьший уровень производительности i - ой группы равен s[i]. Поэтому ее производительность равна (p[0] + p[1] + … + p[i]) * s[i]. Искомая максимальная продуктивность равна

 

ПРОГРАММА

 

#include <cstdio>

#include <vector>

#include <algorithm>

#include <functional>

using namespace std;

 

class GroupWork

{

public:

  long long bestGroup(vector<int> p, vector<int> s)

  {

    vector<pair<int,int> > v;

    long long res, i, people;

    for(i = 0; i < p.size(); i++) v.push_back(make_pair(s[i],p[i]));

    sort(v.begin(),v.end(),greater<pair<int,int> >());

    for(people = res = i = 0; i < v.size(); i++)

    {

      people += v[i].second;

      if (res < people * v[i].first) res = people * v[i].first;

    }

    return res;

  }

};