Форум сайта python.su
Доброго времени суток!
Задача:
В пруд запустили N голодных окуней, которые стали постепен-
но поедать друг друга. Окунь считается сытым, если он съел M
окуней (сытых или голодных). Какое наибольшее количество
окуней может насытиться?
N=input("Input the number of fish: ")
M=input("Input the number of fish a fish needs to eat: ")
z=0
if M == 0 or N == 0: # проверка корректности ввода
print N
elif M > N:
print 0
else:
a=N/(M+1) # переменные a и b помогают определить, можно ли разбить все количество рыб на полноценные "пищевые группы"
b=N-a*(M+1) #(в такой группе M окуней, которых едят, и один окунь, который ест.)
if b == M:
while N/(M+1) > 1:
N=N/(M+1)
z+=N
print z+1
else:
while N/(M+1) > 1:
N=N/(M+1)
z+=N
print z
raw_input("Press enter to escape.")
Отредактировано (Июнь 23, 2009 13:55:18)
Офлайн
Позвольте уточнить вопрос, дабы помогать было легче:
каждый цикл while в приведенном выше коде получает значение для N. Необходимо суммировать все значения N в одной переменной, чтобы потом напечатать ответ (число сытых окуней). Но запись z+=N не помогает . Мне кажется, что в сумме, выводимой z, не хватает результата последнего цикла(см. приведенную ситуацию). Как это поправить?
Заранее спасибо.
Офлайн
А не хотите решить задачу сначала математически?
Из условий задачи не ясно может ли есть окунь которого едят (или частично съели). Съедает ли окунь другого сразу?
В любом случае моделирование процесса не нужно. Достаточно вывести формулу количества съеденных от времени.
Отредактировано (Июнь 23, 2009 20:31:59)
Офлайн
Да, окунь действительно съедает другого сразу. Поэтому в задаче, так сказать, условное понимание времени. То есть, в первую единицу времени произошло первое поедание окуней. Во вторую единицу времени произошло второе поедание окуней(уже из тех, кто остался)
Пример для 4 окуней (N равно 4) и M равно 1 (т.е. надо съесть 1 окуня, чтобы насытиться)
с нулевой единицы времени по первую:
двое окуней поедают двух других окуней. Сытых окуней двое. Двое окуней осталось.
с первой едницы времени по вторую:
один окунь поедает одного окуня. Сытых окуней трое. Один окунь остался.
со второй единицы времени по третью:
остался один окунь. Есть ему некого.
=) По-моему, в математических формулах нет обозначения для цикла.
Решилось! Нужно постоянно знать, сколько окуней на каждом цикле в “поеданиях” (XD) не участвуют.
N=input("Input the number of fish: ")
M=input("Input the number of fish to eat: ")
z=0
if M == 0 or N == 0: #проверка корректности ввода
print N
elif M >= N:
print 0 #закончена проверка корректности ввода
else:
a=N%(M+1) #узнаём, сколько окуней не участвует в поедании
while N>M: # запускаем перебор
S=(N-a)/(M+1) #S - сытые окуни
N=N-S*M #N - оставшиеся окуни
a=N%(M+1) #a - окуни, не участвующие в следующем цикле
z+=S #z - счетчик сытых окуней
print z
raw_input("Press enter to escape.")
Офлайн
Пример для 4 окуней (N равно 4) и M равно 1 (т.е. надо съесть 1 окуня, чтобы насытиться)Двое съели других двух. Остолось 2.
с нулевой единицы времени по первую:
двое окуней поедают двух других окуней. Сытых окуней двое. Двое окуней осталось.
с первой едницы времени по вторую:Откуда взялся 3-й окунь?
один окунь поедает одного окуня. Сытых окуней трое. Один окунь остался.
Офлайн
Откуда взялся 3-й окунь?С каждой единицей времени все окуни снова становятся голодными. Конечно, из условия задачи это никак не следует, но без этого она неинтересна.
Офлайн
FILLIPOТогда все окуни всегда будут голодными, и в конце всегда будет оставаться один :)
С каждой единицей времени все окуни снова становятся голодными.
Отредактировано (Июнь 25, 2009 12:25:08)
Офлайн
pasaranaxПо-моему, не совсем так. Например при N=4 и M=2 в конце остается 2 окуня.
и в конце всегда будет оставаться один
pasaranaxСкорей всего нет. Это же не пираньи :)
Еще интересно, может ли один окунь съесть другого в тот момент, когда тот поедает третьего.
Отредактировано (Июнь 25, 2009 12:48:59)
Офлайн
Все равно твои предыдущие рассуждения не верны. Даже если все становятся голодными опять, то откуда взяться 3-му окуню? В предыдущей итерации из только 2 осталось.
Офлайн
Ну, как же так, третий окунь материализовался на шаге:
с первой едницы времени по вторую:Трое их потому, что на предыдущем шаге уже появились двое сытых окуней.
один окунь поедает одного окуня. Сытых окуней трое. Один окунь остался.
Офлайн