Классная задача! Давай разберёмся и дам тебе подсказку, чтобы ты мог быстро проверить своё решение.
Что нужно сделать в каждой строке (из 6 чисел):
- есть и повторяющиеся, и неповторяющиеся числа;
- среднее арифметическое неповторяющихся чисел должно быть меньше среднего арифметического повторяющихся чисел. При расчётах каждое число учитывается столько раз, сколько раз оно встречается в строке.
Как это посчитать понятно и надёжно:
- Посчитай частоты каждого числа в строке.
- Определи два множества/порции:
- неповторяющиеся числа: те, у которых частота = 1 (они встречаются по одному разу);
- повторяющиеся числа: те, у которых частота > 1. Здесь важно учитывать каждое вхождение: если число 5 встречается 3 раза, оно должно участвовать в средних как 5, 5, 5.
- Условие выполняется, если:
- есть и неповторяющиеся, и повторяющиеся числа;
- среднее неповторяющихся меньше среднего повторяющихся, причём средние считать с учётом multiplicity.
Удобная формула без работы с плавающей точкой (чтобы не было ошибок): сравниваем (sum_nepovt / len_nepovt) < (sum_povt / len_povt) и эквивалентно sum_nepovt * len_povt < sum_povt * len_nepovt где:
- sum_nepovt — сумма неповторяющихся чисел (их сумма, каждый по одному разу),
- len_nepovt — количество неповторяющихся чисел,
- sum_povt — сумма всех повторяющихся чисел с учётом повторов (каждое повторяющееся число учитывается столько раз, сколько оно встречается),
- len_povt — количество всех повторяющихся чисел с учётом повторов.
Пример на одной строке (для наглядности): Допустим строка: 2 3 2 5 7 5
- частоты: 2→2, 3→1, 5→2, 7→1
- неповторяющиеся: [3, 7], sum_nepovt = 10, len_nepovt = 2
- повторяющиеся с учётом повторов: [2, 2, 5, 5], sum_povt = 14, len_povt = 4
- сравнение: 10/2 = 5 и 14/4 = 3.5 → 5 < 3.5? Нет → условие не выполняется.
Чистый кодовый подход (Python-как в твоём примере) почти идеален:
- посчитать counts для строки;
- nepovt = [x for x in a if counts[x] == 1]
- povt = [x for x in a if counts[x] > 1] # здесь учитываются все вхождения
- проверить: len(nepovt) > 0 и len(povt) > 0 и sum(nepovt) * len(povt) < sum(povt) * len(nepovt)
- если да, увеличить счётчик.
Подсказки по твоему коду:
- твоё решение с povt и nepovt на базе a.count(x) работает, но может быть медленным на больших файлах (множество повторных вычислений a.count(x)). Лучше один раз посчитать counts и затем использовать его.
- Я бы записал так (идея, чтобы понять):
- counts = {}
- for x in a: counts[x] = counts.get(x, 0) + 1
- nepovt = [x for x in a if counts[x] == 1]
- povt = [x for x in a if counts[x] > 1]
- если nepovt и povt и sum(nepovt) * len(povt) < sum(povt) * len(nepovt): k += 1
А если хочешь, могу проверить твой код на паре тестовых строк и разобрать, почему именно так работает (или не работает) на примерах.
С учётом того, что ответ по всей задаче — 2122 строк — твой подход в целом правильный и даёт верный результат при корректной реализации.
Хочешь, чтобы я прогнал на нескольких тестовых строках и пошагово разобрал, как считается каждое условие? Потом можно переходить к полной автоматизации подсчёта для всей таблицы.
Пожалуйста, оцените мой ответ лайком или дизлайком.