помогите найти наибольшие элементы словаря

Рассмотрим правила игры в Шкатулки. Имеется N шкатулок, пронумерованных числами от 1 до N и содержащих ровно по одному желудю. Над шкатулками возможны три операции:

+ А В – данная команда означает сложить все желуди из шкатулки с номером В в шкатулку с номером А. В результате шкатулка с номером В будет пустой, а шкатулка с номером А будет содержать суммарное количество желудей из шкатулок А и В.

/ А В - данная команда означает поделить все желуди из шкатулки с номером В между шкатулками с номерами А и В. В результате шкатулка с номером В получит половину своего содержимого (меньшую, при нечетном количестве желудей), а шкатулка с номером А будет содержать суммарное количество желудей, которое в ней было, и половину желудей из шкатулки В (большую, при нечетном количестве).

* А В – данная команда означает обменять содержимое шкатулок с номерами А и В. В результате содержимое шкатулки с номером В переместится в шкатулку с номером А, а содержимое шкатулки с номером А переместится в шкатулку с номером В.

Формат ввода Первая строка файла содержит два числа N – количество шкатулок и К – количество команд, перемещающих желуди между шкатулками. Далее следует К строк, каждая состоит из одного символа (‘+’, ‘/’, ‘*’) и двух чисел (каждое от 1 до N). Все параметры разделены одним пробелом.

Формат вывода В первой строке выведите количество шкатулок, содержащих наибольшее количество желудей. Во второй строке выведите в порядке возрастания номера шкатулок, содержащих наибольшее количество желудей. '''

import math
n, i = map(int, input().split(" "))
keys = list(range(1, n+1))
value = [1] * n
dict_1 = dict(zip(keys, value))
for i in range(i):
    operation, a, b = map(str, input().split(' '))
    if operation == '+':
        dict_1[int(b)] = dict_1[int(b)] - 1
        dict_1[int(a)] = dict_1[int(a)] + 1
    elif operation == '*':
        x = dict_1[int(b)]
        y = dict_1[int(a)]
        dict_1[int(b)] = y
        dict_1[int(a)] = x
    elif operation == '/':
        z = dict_1[int(b)]/2
        dict_1[int(a)] = dict_1[int(a)] + math.ceil(z)
        dict_1[int(b)] = int(z)
print(1)
Keymax = max(dict_1, key=dict_1.get)
print(Keymax)

'''


Ответы (2 шт):

Автор решения: MBo

Словари в данной задаче ни к чему, достаточно простого списка длиной n+1. Операция + реализована неверно, нужно переносить все жёлуди. Переменная i используется неаккуратненько.

n, k = map(int, input().split(" "))
L = [1] * (n+1)
for i in range(k):
    operation, a, b = map(str, input().split(' '))
    a = int(a)
    b = int(b)
    if operation == '+':
        L[a] += L[b]
        L[b] = 0
    elif operation == '*':
        L[a], L[b] = L[b], L[a]
    elif operation == '/':
        lob = L[b]//2
        L[a] += L[b] - lob 
        L[b] = lob
mx = max(L)
for i, x in enumerate(L):
    if x == mx:
        print(i, end = " ")
→ Ссылка
Автор решения: SergFSM

если по существу вопроса (найти наибольшие элементы словаря) то попробуйте так:

m = max(dict_1.values())  # максимальное значение
keymax = dict(filter(lambda x: x[1]==m, dict_1.items()))  # элементы с максимальным значением
→ Ссылка