Задача взята с сайта e-olymp
Задача
Спортсменам-фигуристам [latex]n[/latex] судей выставляют оценки. Технический работник соревнований изымает все максимальные и все минимальные оценки, а для остальных оценок вычисляет среднее арифметическое значение. Этот результат считается баллом, полученным спортсменом. Найти такой балл для каждого спортсмена.
Входные данные
В первой строке находятся два целых числа: количество судей [latex]n[/latex] и количество спортсменов [latex]m[/latex]. В следующих [latex]m[/latex] строках находятся [latex]n[/latex] целых чисел – оценки всех судей[latex]\left( 0 \lt n \leqslant 10, 0 \lt m \leqslant 100 \right)[/latex] для каждого из фигуристов.
Выходные данные
В одной строке вывести m чисел с точностью до двух десятичных знаков — балл каждого спортсмена.
Тесты
# | ВХОДНЫЕ ДАННЫЕ | ВЫХОДНЫЕ ДАННЫЕ |
1 | 5 4 7 8 9 8 10 6 5 5 4 7 9 9 10 7 7 7 7 10 9 8 |
8.33 5.33 9.00 8.50 |
2 | 3 4 1 2 3 3 5 2 7 1 6 9 8 3 |
2.00 3.00 6.00 8.00 |
3 | 10 2 1 2 3 4 5 6 7 8 9 10 1 1 1 2 2 2 3 3 3 4 |
5.50 2.50 |
Код программы (Потоковая обработка)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
#include <iostream> #include <iomanip> using namespace std; int main() { cout << fixed << setprecision(2); int n, m, tmp, sumGl, sumMin, sumMax, valMin, valMax, countMin, countMax; cin >> n >> m; for(int j = 0 ; j < m ; j++){ sumGl = sumMin = sumMax = 0; valMin = 11; valMax = 0; countMin = countMax = 0; for(int i = 0 ; i < n; i++) { cin >> tmp; sumGl += tmp; if(tmp < valMin) { sumMin = tmp; valMin = tmp; countMin = 1; } else if(tmp == valMin) { sumMin += tmp; countMin++; } if(tmp > valMax) { sumMax = tmp; valMax =tmp; countMax = 1; } else if(tmp == valMax) { sumMax += tmp; countMax++; } } cout << (sumGl - sumMax - sumMin) / (double)(n - countMax - countMin) << " "; } return 0; } |
Решение
Читая каждую оценку:
- Добавляем оценку к общей сумме;
- Если введенная оценка равна минимальной, то добавляем ее к сумме минимальных и увеличиваем счётчик количества минимальных.
- Если введенная оценка меньше минимальной, то минимальной становится введённая оценка. Счетчик количества минимальных равен [latex]1.[/latex] Сумма минимальных равна введённой оценке.
- Если введенная оценка равна максимальной, то добавляем ее к сумме максимальных и увеличиваем счётчик количества максимальных.
- Если введенная оценка больше максимальной, то максимальной становится введённая оценка. Счетчик количества максимальных равен [latex]1.[/latex] Сумма максимальных равна введённой оценке.
Тогда после введения всех [latex]n[/latex] оценок имеем:
- [latex]sumMax[/latex] — сумма максимальных оценок.
- [latex]sumMin[/latex] — сумма минимальных оценок.
- [latex]countMax[/latex] — количество максимальных оценок.
- [latex]countMin[/latex] — количество минимальных оценок.
- [latex]sumGl[/latex] — общая сумма оценок.
Для нахождения среднего арифметического значения оценок, соответствующего условию будем применять формулу: [latex]S_с = \frac{sumGL-sumMin-sumMax}{n-countMin-countMax}[/latex]
Код программы (Массивы)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
#include <iostream> #include <iomanip> using namespace std; double res(int *arr, int len) { int min,max; min = arr[0]; max = arr[0]; for(int i = 1; i < len; i++) { if(arr[i] > max) { max = arr[i]; } if(arr[i]<min) { min = arr[i]; } } int sum = 0; int count = 0; for(int i = 0; i < len; i++) { if(arr[i] != max && arr[i] != min) { sum += arr[i]; count++; } } return sum/((double)count); } int main() { int m, n; cin >> n >> m; cout << fixed << setprecision(2); for(int i = 0; i < m; i++) { int* arr = new int[n]; for(int j = 0 ; j < n; j++) { cin >> arr[j]; } cout << res(arr, n) << " "; delete[] arr; } return 0; } |
Решение
Делаем без счетчиков, запоминаем все элементы. Находим минимум и максимум, дальше проходим по всем оценкам и, если она не минимальная и не максимальная, добавляем к сумме и увеличиваем количество оценок, которые учитываются для среднего значения. В конце выводим среднее значение с двумя знаками после запятой.
Ссылки
Условие задачи на e-olymp
Код программы на ideone (Потоковая обработка)
Код программы на ideone (Массивы)
Для отправки комментария необходимо войти на сайт.