Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2019, 10:22   #1
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию Кузнечик

Прошу помощи при решении задачи. На первый взгляд как-бы простая, но при написании алгоритма проходит лишь 25%. Собственно условие таково:
Кузнечик долго сидел на делении 0 числовой прямой, так долго, что придумал инновационную методологию своего перемещения. Так что за каждую итерацию движения он выполняет ровно два прыжка, перемещаясь сначала на a, а затем на b единичных отрезков по числовой прямой, причем, если число положительное, то он движется вправо, а если отрицательное, то влево. Продолжительность скачка в секундах равна соответствующему количеству единичных отрезков, на которую перемещается кузнечик.

Например, если a=3, а b=2, то через 3 сек. он будет на делении 3, а через 5 сек. от начала движения попадет на отметку 1. Далее, на 8 секунде переместится на деление 4, а на 10 секунде вернется на 2.

При заданных a и b найти сколько необходимо времени в секундах, чтобы допрыгнуть до отметки x числовой прямой или вывести -1, если это невозможно.
Мой код:
Код:
var a,b,x,t:longint;
 begin
  read (a,b,x);
   if (x div (a+b)<>a+b) then t:=-1 else
   
   if ((a>0) and (b<0)) or ((a<0) and (b>0)) then t:=(abs(a)+abs(b))*abs(x) else
   if ((a>0) and (b>0)) or ((a<0) and (b<0)) then t:=abs(x) else
   if (a=-b) then t:=0;
   
   write (t);
  end.
kim-im вне форума Ответить с цитированием
Старый 19.02.2019, 10:48   #2
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Задача, несмотря на американский "оживляж" всякой фигней, сформулирована через ^опу. Если он попадает в x через a, то b он уже не прыгает, т.е. два прыжка на каждом шаге не обязательны ? А если прыгает, то эти дурные a и b можно заменить одним a+b и делить х на эту сумму. Если целое - все ясно, если дробное, то -1. Кстати, в примере b = -2.
Глядя на это безобразие, приходит на ум Задорновское : "Ну тупые!" - не по отношению к американским детишкам, а к составителям этих бредней, своим "оживляжем" затмевающим суть, и к нашим, обезьянно повторяющим эту галиматню. Впрочем, дебилизация - на марше!

Последний раз редактировалось digitalis; 19.02.2019 в 10:52.
digitalis вне форума Ответить с цитированием
Старый 19.02.2019, 11:00   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Удивительно что 25%. Твой способ решения вообще ни о чем.
Что будет если x=0?
Что будет если a=-b? А если при этом x=2 и a=3?
Как решать если x>0?
А если x<0?
А если перепрыгнет отметку x, то достиг её или нет?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.02.2019, 12:00   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от kim-im Посмотреть сообщение
Например, если a=3, а b=2,
давайте начнём с того, что Вы уже пример неверно скопировали.

b в вашем примере -2 (минус 2)

согласно - https://www.e-olymp.com/ru/problems/8701
Цитата:
Например, если a = 3, а b = - 2, то через 3 сек. он будет на отметке 3, а через 5 сек. от начала движения попадет на отметку 1. Далее, на 8 секунде переместится на отметку 4, а на 10 секунде вернется на 2.
А дальше, чтобы решить задачу, отвечайте на вопросы в пост #3

p.s.
Цитата:
Сообщение от Аватар Посмотреть сообщение
А если перепрыгнет отметку x, то достиг её или нет?
судя по контрпримеру (см.3 -2 1), достигнуть точки x - это оказаться в данной точке после очередной итерации (ровно через два прыжка).
x может быть как положительным, так и отрицательным.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.02.2019, 16:37   #5
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
давайте начнём с того, что Вы уже пример неверно скопировали.

b в вашем примере -2 (минус 2)

согласно - https://www.e-olymp.com/ru/problems/8701


А дальше, чтобы решить задачу, отвечайте на вопросы в пост #3

p.s.

судя по контрпримеру (см.3 -2 1), достигнуть точки x - это оказаться в данной точке после очередной итерации (ровно через два прыжка).
x может быть как положительным, так и отрицательным.
Подскажите, пожалуйста что я ещё не учел. Голова кипит.
Код:
var a,b,x,t,s:longint;
 begin
  read (a,b,x);
   if ((x=0) and (a=-b)) then t:=0 else 
    if ((x>0) and ((a<>0) and (b<>0) and (a>b) and (b>a) and (a>0) and (b>0) and (x div (a+b)=abs(a+b)))) then t:=(abs(a)+abs(b))*abs(x) else
     if ((x<0) and ((a<>0) and (b<>0) and (a<b) and (b<a) and (a<0) and (b<0) and (x div (a+b)=abs(a+b)))) then t:=(abs(a)+abs(b))*abs(x) else 
      if ((x>0) and (a>0) and (b>0) and (abs(x) mod (abs(a)+abs(b))=0)) then t:=x else
       if ((x<0) and (a<0) and (b<0) and (abs(x) mod (abs(a)+abs(b))=0)) then t:=abs(x) else
     t:=-1;
    
    write (t);
  end.
Проходит на тех же 25%
kim-im вне форума Ответить с цитированием
Старый 19.02.2019, 16:43   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Код:
and (a>b) and (b>a)
это всегда False
Код:
t:=(abs(a)+abs(b))*abs(x)
на бумаге хоть проверил эту абракадабрость? Типа если скорость умножить на расстояние, то получим ого чего )
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.02.2019, 17:04   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

я бы решал эту задачу так:

Код:
if (x=0) then t := 0 
else
если нужно достичь точку нулевую, то мы в ней уже находимся.

иначе проверка такая

Код:
t := -1;
step := a + b;
if ((step*x)>0) and (abs(step)>0) and (abs(x) mod abs(step) = 0) then 
t := (abs(x) div abs(step))*(abs(a)+abs(b));
p.s. (step*x)>0
- это условие, что шаг движения и x находятся по одну сторону от нуля (имеют одинаковый знак)

(abs(x) mod abs(step) = 0) -
это проверка того, что позиция x кратна шагу.

p.p.s. моему решению слепо я бы доверять не стал - проверьте внимательно на разных входных данных.
допускаю, что я мог и накосячить.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.02.2019, 17:12   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

там по идее еще на каком то этапе может достичь x сделав только шаг a
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 19.02.2019, 17:17   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
там по идее еще на каком то этапе может достичь x сделав только шаг a
это вряд ли:

Цитата:
Сообщение от kim-im Посмотреть сообщение
Так что за каждую итерацию движения он выполняет ровно два прыжка
Serge_Bliznykov вне форума Ответить с цитированием
Старый 19.02.2019, 17:46   #10
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,536
По умолчанию

Так что задача сводится к банальному: за сколько стограммовых рюмок можно точно осушить заданной емкости бутыль. Безо всяких прыжков, итераций, инноваций и кузнечиков.
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Кузнечик... daniil123 Паскаль, Turbo Pascal, PascalABC.NET 3 30.01.2012 10:54