Матч
309, Координатор соревнования (ContestCoordinator)
Дивизион 2,
Уровень 1
Координатору необходимо
определить качество проведенного соревнования. Для этого из списка баллов, набранных
участниками, следует убрать k
наибольших и k наименьших (k может равняться нулю), и найти среднее
арифметическое оставшихся баллов, которое полагается равным качеству
соревнования. Необходимо найти такое k,
для которого качество соревнования наибольшее и вывести его значение.
Класс: ContestCoordinator
Метод: double bestAverage(vector<int> scores)
Ограничения:
numbers содержит от 1 до 50 элементов, 1 £ numbers[i]
£ 100.
Вход. Оценки участников соревнований, заданные в массиве numbers.
Выход. Наибольшее возможное значение качества соревнования.
Пример входа
scores |
{1} |
{1, 2, 3, 4} |
{1,1,999,999,1000,1000} |
{1,13,8,6,7,9} |
Пример выхода
1.0
2.5
999.0
7.5
РЕШЕНИЕ
сортировка + перебор
Отсортируем числа в массиве.
Переберем все возможные значения k от
0 до len / 2, где len – длина массива scores. Для каждого
значения k найдем среднее
арифметическое элементов массива scores[k],
scores[k+1], …, scores[len-k].
Среди всех найденных средних арифметических находим наибольшее.
ПРОГРАММА
#include <cstdio>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
class ContestCoordinator
{
public:
double bestAverage(vector<int>
scores)
{
int k, len = scores.size();
double res = 0;
sort(scores.begin(),scores.end());
for(k = 0; 2 * k <= len; k++)
res = max(res,accumulate(scores.begin() + k,scores.end() - k,0.0) / (len
- 2 * k));
return res;
}
};