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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.02.2019, 17:56   #11
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Не, все таки там где-то в засаде лягушка и привет кузнечик ) ТС может скажет так или нет
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.02.2019, 15:09   #12
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
я бы решал эту задачу так:

Код:
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. моему решению слепо я бы доверять не стал - проверьте внимательно на разных входных данных.
допускаю, что я мог и накосячить.
Спасибо вам большое за помощь, задача меня просто достала. вариант проходит на 55%. Хотя уже протестировал на разных входных даных.
Код:
var a,b,x,t,s:longint;
 begin
  read (a,b,x);
   if ((x=0) or (a=-b)) then t:=0 else
    begin
     t:=-1;
     s:=a+b;
      if ((s*x)>0) and (abs(s)>0) and (abs(x) mod abs(s)=0) then 
        t:=(abs(x) div abs(s))*(abs(a)+abs(b));
     end;
    
    write (t);
  end.
kim-im вне форума Ответить с цитированием
Старый 20.02.2019, 15:36   #13
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от kim-im Посмотреть сообщение
if ((x=0) or (a=-b)) then t:=0 else
это немного не то, что я предложил.

а если так?
Код:
var a,b,x,s:longint;
 begin
   read (a,b,x);
   if (x=0) then Write(0) else
   if a=-b then Write(-1) else
   begin
     s:=a+b;
     if ((s*x)>0) and (abs(s)>0) and (abs(x) mod abs(s)=0) then 
        Write((abs(x) div abs(s))*(abs(a)+abs(b)))
     else
        Write(-1)
     end;
  end.
p.s. там ещё один возможный "булыжник за пазухой" есть - если числа выходят за рамку longint.
тогда можно попробовать такой код:
Код:
var a,b,x:longint;
  t, s, v, xx : int64; 
 begin
   read (a,b,x);
   if (x=0) then Write(0) else
   if (a=-b) or ((s*x)<=0)  then Write(-1) else
   begin
     s:=a;
     s:=abs(s+b); 
     v:=abs(a);
     v:=v+abs(b); 
     xx := abs(x); 
     t := -1;
     if (xx mod s)=0 then 
         t := v*(xx div s);
     Write(t)
   end
 end.
он избыточно громоздкий. чтобы как раз попытаться избежать переполнения

Последний раз редактировалось Serge_Bliznykov; 20.02.2019 в 15:42.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 20.02.2019, 15:53   #14
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Первый прошёл на 55%. Второй на 25%. Наверное это из за типа. Перепробовал int64 - не проходит. Все тех же 55%. Qword не подойдет. А длинную арифметику писать наверное не буду, т.к. для меня это слишком космически. Спасибо вам огромное.
kim-im вне форума Ответить с цитированием
Старый 20.02.2019, 16:49   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Вдруг все таки можно остановиться после шага a ) Попробуй это из #13
Код:
     if ((s*x)>0) and (abs(s)>0) and (abs(x) mod abs(s)=0) then 
        Write((abs(x) div abs(s))*(abs(a)+abs(b)))
     else
        Write(-1)
     end;
заменить на
Код:
     if ((s*x)>0) and (abs(x) mod abs(s)=0) then 
        Write((abs(x) div abs(s))*(abs(a)+abs(b)))
     else if ((s*x)>0) and (abs(x-a) mod abs(s)=0) then 
        Write((abs(x-a) div abs(s))*(abs(a)+abs(b))+abs(a))
     else
        Write(-1)
     end;
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.02.2019, 09:59   #16
kim-im
Пользователь
 
Регистрация: 07.11.2017
Сообщений: 42
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Вдруг все таки можно остановиться после шага a ) Попробуй это из #13
Код:
     if ((s*x)>0) and (abs(s)>0) and (abs(x) mod abs(s)=0) then 
        Write((abs(x) div abs(s))*(abs(a)+abs(b)))
     else
        Write(-1)
     end;
заменить на
Код:
     if ((s*x)>0) and (abs(x) mod abs(s)=0) then 
        Write((abs(x) div abs(s))*(abs(a)+abs(b)))
     else if ((s*x)>0) and (abs(x-a) mod abs(s)=0) then 
        Write((abs(x-a) div abs(s))*(abs(a)+abs(b))+abs(a))
     else
        Write(-1)
     end;
Спасибо. Проходит уже на 90%. Тут такая фишка, что при начальных значения 3 2 0 выводит 0, хотя должно -1.

Последний раз редактировалось kim-im; 21.02.2019 в 10:07.
kim-im вне форума Ответить с цитированием
Старый 21.02.2019, 10:15   #17
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от kim-im Посмотреть сообщение
Тут такая фишка, что при начальных значения 3 2 0 выводит 0, хотя должно -1.
спорно. если кузнечик сразу находится в точке 0 и ему нужно попасть в точку ноль, то сколько это займёт времени?
я решил, что это займёт 0 секунд:
Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
if (x=0) then Write(0) else
если это не так - исправьте на -1
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


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