Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 22, 2009 16:15:53

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

Доброго времени суток!

Задача:

В пруд запустили 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 окуня куда-то пропали).



Отредактировано (Июнь 23, 2009 13:55:18)

Офлайн

#2 Июнь 23, 2009 19:50:21

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

Позвольте уточнить вопрос, дабы помогать было легче:

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

Заранее спасибо.



Офлайн

#3 Июнь 23, 2009 20:30:05

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

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

Отредактировано (Июнь 23, 2009 20:31:59)

Офлайн

#4 Июнь 24, 2009 19:48:47

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

Да, окунь действительно съедает другого сразу. Поэтому в задаче, так сказать, условное понимание времени. То есть, в первую единицу времени произошло первое поедание окуней. Во вторую единицу времени произошло второе поедание окуней(уже из тех, кто остался)

Пример для 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.")
Спасибо за проявленный интерес и помощь. Решил сначала на бумажке ;)



Офлайн

#5 Июнь 25, 2009 00:44:43

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

Пример для 4 окуней (N равно 4) и M равно 1 (т.е. надо съесть 1 окуня, чтобы насытиться)
с нулевой единицы времени по первую:
двое окуней поедают двух других окуней. Сытых окуней двое. Двое окуней осталось.
Двое съели других двух. Остолось 2.
с первой едницы времени по вторую:
один окунь поедает одного окуня. Сытых окуней трое. Один окунь остался.
Откуда взялся 3-й окунь?

На бумажке - это правильно.
А по поводу цикла в математике - там много разных. Интеграл, например :)

Офлайн

#6 Июнь 25, 2009 12:02:08

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

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

Спасибо



Офлайн

#7 Июнь 25, 2009 12:24:05

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

FILLIPO
С каждой единицей времени все окуни снова становятся голодными.
Тогда все окуни всегда будут голодными, и в конце всегда будет оставаться один :)
Еще интересно, может ли один окунь съесть другого в тот момент, когда тот поедает третьего.



Отредактировано (Июнь 25, 2009 12:25:08)

Офлайн

#8 Июнь 25, 2009 12:43:26

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

pasaranax
и в конце всегда будет оставаться один
По-моему, не совсем так. Например при N=4 и M=2 в конце остается 2 окуня.

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

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



Отредактировано (Июнь 25, 2009 12:48:59)

Офлайн

#9 Июнь 25, 2009 16:34:18

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

Все равно твои предыдущие рассуждения не верны. Даже если все становятся голодными опять, то откуда взяться 3-му окуню? В предыдущей итерации из только 2 осталось.

Офлайн

#10 Июнь 25, 2009 18:51:47

FILLIPO
От:
Зарегистрирован: 2009-05-03
Сообщения: 60
Репутация: +  0  -
Профиль   Отправить e-mail  

"Голодные Окуни" или Помогите добить задачку!

Ну, как же так, третий окунь материализовался на шаге:

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

На самом деле, меня сейчас шахматные слоны мучают.:D
Но там я пока вообще не продвинулся :(



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version