Форум сайта python.su
0
Здравствуйте.
Помогите с такой вот задачей:
Имеется набор данных, состоящий из троек положительных целых чисел. Необходимо выбрать из каждой тройки ровно одно число так, чтобы сумма всех выбранных чисел не делилась на 5 и при этом была минимально возможной. Если получить требуемую сумму невозможно, в качестве ответа нужно выдать 0.
Пример ввода:
1 3 2
2 1 2
2 5 1
1 3 4
6 1 1
Вывод:
6
Не могу никак сообразить, как произвести перебор троек из набора, помогите мне с этим, пожалуйста (остальное не нужно).
Отредактировано SalikhovAbd (Март 23, 2018 22:45:16)
Офлайн
76
a = '1 3 2' for x in a.split(): print(int(x))
Офлайн
0
RomissevdНет, это не то.
Офлайн
0
RomissevdНет, это не то.
Офлайн
221
Модуль itertools , а именно его функции для комбинаторики
Офлайн
SalikhovAbdпреобразуй в двумерный массив
как произвести перебор троек из набора
>>> doc = '''1 3 2 2 1 2 2 5 1 1 3 4 6 1 1''' >>> a =[sorted([int(j) for j in i.split()]) for i in doc.split('\n')] >>> a [[1, 2, 3], [1, 2, 2], [1, 2, 5], [1, 3, 4], [1, 1, 6]] >>> a0 = sorted([i[0] for i in a]) >>> a0 [1, 1, 1, 1, 1] >>> t = sorted([i[1] for i in a] + [i[2] for i in a]) >>> t [1, 2, 2, 2, 2, 3, 3, 4, 5, 6] >>> for i in t: s= sum(a0) if s%5: print(a0,s) break a0[-1] = i [1, 1, 1, 1, 2] 6
Офлайн
186
Это то решение которое ты описал
>>> st = [(1, 2, 3), (1, 2, 2), (1, 2, 5), (1, 3, 4), (1, 1, 6)] >>> s = { (x, y, z) for x, _, _ in st for _, y, _ in st for _, _, z in st if sum((x,y,z))%5 } >>> s set([(1, 2, 6), (1, 3, 2), (1, 1, 6), (1, 2, 3), (1, 3, 5), (1, 1, 4), (1, 2, 4), (1, 3, 4), (1, 1, 5), (1, 1, 2), (1, 2, 5), (1, 3, 3)]) >>> min(s, key=sum) (1, 1, 2) >>> sum(min(s, key=sum)) 4
>>> st = [(1, 2, 3), (1, 2, 2), (1, 2, 5), (1, 3, 4), (1, 1, 6)] >>> sum(min([ x for x in st if sum(x)%5 ], key=sum)) 6
Отредактировано Rodegast (Март 27, 2018 14:18:35)
Офлайн