Форум » Массивы, сортировка, работа с файлами » Задача 2646 » Ответить

Задача 2646

VectorASD: Код программы: [pre2] GPath = "" #__file__.rsplit("/", 1)[0] + "/" def Z2644(): with open(GPath + "26-j2.txt") as file: N = int(file.readline()) Data = [int(file.readline()) for i in range(N)] #Data = 10, 37, 47, 47, 60, 65, 84 #N = 7 Data = sorted(Data) SredA = sum(Data) // N Median = Data[len(Data) // 2] print("Среднее значение:", SredA) for Median in range(SredA - 10, SredA + 10): if Median > SredA: A, B = SredA, Median else: A, B = Median, SredA R = range(A, B + 1) Data2 = [i for i in Data if i in R] print("Интервал [%s;%s], Ответ: %s" % (A, B, len(Data2))) Z2644() [/pre2] Выводка: [pre2] Интервал [4993;5003], Ответ: 1121 Интервал [4994;5003], Ответ: 1027 Интервал [4995;5003], Ответ: 927 Интервал [4996;5003], Ответ: 825 Интервал [4997;5003], Ответ: 736 Интервал [4998;5003], Ответ: 616 Интервал [4999;5003], Ответ: 520 Интервал [5000;5003], Ответ: 423 Интервал [5001;5003], Ответ: 325 Интервал [5002;5003], Ответ: 224 Интервал [5003;5003], Ответ: 102 Интервал [5003;5004], Ответ: 193 Интервал [5003;5005], Ответ: 269 Интервал [5003;5006], Ответ: 361 Интервал [5003;5007], Ответ: 442 Интервал [5003;5008], Ответ: 528 Интервал [5003;5009], Ответ: 634 Интервал [5003;5010], Ответ: 725 Интервал [5003;5011], Ответ: 832 Интервал [5003;5012], Ответ: 921 [/pre2] Как видно, здесь нет того ответа, что равен 340 Зато верно получается ответ и среднее арифметическое в примере и даже медиана -_- В чём дело? Очевидно, что дальше перебирать нет смысла, т.к. чем больше разница между медианой и средним арифметическим, тем больше число в ответе

Ответов - 4

EugeneJobs: У вас с нахождением среднего проблема. И это задача 2644.

EugeneJobs: Вот примеры. Ваш код соответствует генератору для data3. from math import * f = open('26-j2.txt') n = int(f.readline()) a = sorted(map(int, f.readlines()[:n])) s1, s2 = sorted([sum(a)/n, a[len(a) // 2]]) data1 = [s1 <= i <= s2 for i in a] data2 = [i in range(ceil(s1), int(s2)+1) for i in a] data3 = [i in range(int(s1), int(s2)+1) for i in a] print(sum(data1)) print(sum(data2)) print(sum(data3)) Вывод: 340 340 442

VectorASD: Так бы и написали, что среднее арифметическое надо не через // получать, а через ceil Одним словом охото, чтобы Джобса уволили за СЛИИИИШКОМ сложные задачки, которые даже решить нельзя по тому, что ЭТО ЕДИНСТВЕННАЯ из 26 задача, в которой среднее арифметическое не через // делается Я то все 57 прорешал, при том последние 21 (на деле я их в обратном порядке решаю) - одно и тоже самое


EugeneJobs: Среднее арифметическое ВСЕГДА находится по одному и тому же принципу - сумма элементов деленная на их количество. То, что вы себе придумали какой-то "случай для решения 26 заданий" говорит, что вы не понимаете очевидного. Решение в первом генераторе не через ceil, и оно точно правильное, так как исходит из постановки задачи. Конкретно в вашем случае ошибка была в том, что вы расширяли диапазон, если нижняя граница нецелая. Ceil позволяет эту проблему решить для списка из целых чисел. Я лишь обозначил проблему в вашем случае, чтобы указать на ошибку.



полная версия страницы