Найти - Пользователи
Полная версия: "Голодные Окуни" или Помогите добить задачку!
Начало » Python для новичков » "Голодные Окуни" или Помогите добить задачку!
1 2 3 4 5
FILLIPO
Доброго времени суток!

Задача:
В пруд запустили 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.")
Так вот, не получается цикл while. То есть, расскажите, как результат каждого круга суммировать. Например, в ситуации с N равным 6 и M равным 1 результат 3, хотя должно быть 5(получается, что 2 окуня куда-то пропали).
FILLIPO
Позвольте уточнить вопрос, дабы помогать было легче:

каждый цикл while в приведенном выше коде получает значение для N. Необходимо суммировать все значения N в одной переменной, чтобы потом напечатать ответ (число сытых окуней). Но запись z+=N не помогает . Мне кажется, что в сумме, выводимой z, не хватает результата последнего цикла(см. приведенную ситуацию). Как это поправить?

Заранее спасибо.
Ferroman
А не хотите решить задачу сначала математически?
Из условий задачи не ясно может ли есть окунь которого едят (или частично съели). Съедает ли окунь другого сразу?
В любом случае моделирование процесса не нужно. Достаточно вывести формулу количества съеденных от времени.
FILLIPO
Да, окунь действительно съедает другого сразу. Поэтому в задаче, так сказать, условное понимание времени. То есть, в первую единицу времени произошло первое поедание окуней. Во вторую единицу времени произошло второе поедание окуней(уже из тех, кто остался)

Пример для 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.")
Спасибо за проявленный интерес и помощь. Решил сначала на бумажке ;)
Ferroman
Пример для 4 окуней (N равно 4) и M равно 1 (т.е. надо съесть 1 окуня, чтобы насытиться)
с нулевой единицы времени по первую:
двое окуней поедают двух других окуней. Сытых окуней двое. Двое окуней осталось.
Двое съели других двух. Остолось 2.
с первой едницы времени по вторую:
один окунь поедает одного окуня. Сытых окуней трое. Один окунь остался.
Откуда взялся 3-й окунь?

На бумажке - это правильно.
А по поводу цикла в математике - там много разных. Интеграл, например :)
FILLIPO
Откуда взялся 3-й окунь?
С каждой единицей времени все окуни снова становятся голодными. Конечно, из условия задачи это никак не следует, но без этого она неинтересна.

Спасибо
pasaranax
FILLIPO
С каждой единицей времени все окуни снова становятся голодными.
Тогда все окуни всегда будут голодными, и в конце всегда будет оставаться один :)
Еще интересно, может ли один окунь съесть другого в тот момент, когда тот поедает третьего.
FILLIPO
pasaranax
и в конце всегда будет оставаться один
По-моему, не совсем так. Например при N=4 и M=2 в конце остается 2 окуня.

pasaranax
Еще интересно, может ли один окунь съесть другого в тот момент, когда тот поедает третьего.
Скорей всего нет. Это же не пираньи :)

В любом случае вынужден признать, что условие задачи не из самых точных. Но и составлена она не мной: Открытая олимпиада по программированию 2006 Лицей “Вторая Школа”
Ferroman
Все равно твои предыдущие рассуждения не верны. Даже если все становятся голодными опять, то откуда взяться 3-му окуню? В предыдущей итерации из только 2 осталось.
FILLIPO
Ну, как же так, третий окунь материализовался на шаге:

с первой едницы времени по вторую:
один окунь поедает одного окуня. Сытых окуней трое. Один окунь остался.
Трое их потому, что на предыдущем шаге уже появились двое сытых окуней.
Все, кажется, правильно.

На самом деле, меня сейчас шахматные слоны мучают.:D
Но там я пока вообще не продвинулся :(
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB