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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.01.2017, 01:11   #1
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию скорость движения с зонтиком и без зонтика

Здравия, нужна помощь в такой задаче
Дано число n.
В следующей строке n чисел. (время, за которое каждый пройдет с первой точки во вторую)
Есть две точки, и n человек. Идет дождь, все должны перебраться с первой точки до второй. Зонтиком может пользоваться два человека сразу. Нужно найти минимальное время, за которое все окажутся во второй точке.
Если идут два человека под зонтиком, со со скоростью более медленного.
То есть, берем самого быстрого, и он всех водит с первого пункта во второй. Код нерабочий(плохо рабочий - нерабочий), в чем проблема?
Код:
var
a:array [1..1000] of integer;
n,i,min,kolvo,ch:integer;
fi,fo:text;
begin
Assign(fi,'umbrella.in');
Assign(fo,'umbrella.out');
Reset(fi);
Rewrite(fo);
Read(fi,n);
Readln(fi);
for i:=1 to n do Read(fi,a[i]);
min:=a[1];
ch:=1;
for i:=1 to n do if a[i]<min then 
begin
min:=a[i];
ch:=i;
end;
for i:=1 to n do 
if ch=i then continue
else 
kolvo:=kolvo+a[i]+min;
Write(fo,kolvo-min);
Close(fo);
end.
dimon_snake вне форума Ответить с цитированием
Старый 06.01.2017, 02:08   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Во-первых, лучше инициализировать kolvo нулем.
Во-вторых, в чем выражается неработоспособность кода.
В-третьих, вот так примерно мне видится решение:
Код:
s := 0;
min := max_val; // заведомо большее число
for i := 1 to n do
begin
  Read(fi, a);
  s := s + a;
  if a < min then
    min := a;
end;
s := abs(s + (n - 3) * min);
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.01.2017, 08:08   #3
AnryKZKZ
Пользователь
 
Регистрация: 15.04.2014
Сообщений: 62
По умолчанию

Если я правильно понял, то кодом
Код:
 Read(fi,n);
вы из исходного файла считываете кол-во элементов в файле.
Не совсем понятно что вы считываете этим кодом
Код:
 Readln(fi);
По сути это ручной ввод. Хотя параметр "fi" вы привязали к файлу, где исходные данные.
Как написали ранее - параметр kolvo не инициализирован
И кто будет закрывать сессию с файлом с исходными данными?
Код:
 Close(fi);
AnryKZKZ вне форума Ответить с цитированием
Старый 06.01.2017, 13:06   #4
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Во-первых, лучше инициализировать kolvo нулем.
Во-вторых, в чем выражается неработоспособность кода.
В-третьих, вот так примерно мне видится решение:
Код:
s := 0;
min := max_val; // заведомо большее число
for i := 1 to n do
begin
  Read(fi, a);
  s := s + a;
  if a < min then
    min := a;
end;
s := abs(s + (n - 3) * min);
Кол-во нулем инициализировал, не помогло.
В чем код нерабочий? Работает в 20% случаях - не работает в общем.
И ваш код тоже работает в 20% случаях.
dimon_snake вне форума Ответить с цитированием
Старый 06.01.2017, 13:07   #5
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Цитата:
Сообщение от AnryKZKZ Посмотреть сообщение
вы из исходного файла считываете кол-во элементов в файле.
Не совсем понятно что вы считываете этим кодом
В первой строке у меня n, во второй - n чисел.
Дабы читать вторую строку, Readln(fi) просто переносит строку
dimon_snake вне форума Ответить с цитированием
Старый 06.01.2017, 14:51   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

А у Вас есть пример, на котором код неверно срабатывает, для которого известен верный ответ?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 06.01.2017, 17:39   #7
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

dimon_snake, а Вы время на возвращение учитывать не забываете?

Цитата:
Сообщение от dimon_snake Посмотреть сообщение
То есть, берем самого быстрого, и он всех водит с первого пункта во второй.
думаю, что ошибка в этом.
на форуме была аналогичная задача про переход через мост.

нужно наоборот, быстрых оправлять вместе, а отдельно оправлять вместе медленных, а вот зонт возвращать самым быстрым.
Понятное ведь, если вы самого быстрого отправите вместе с самым медленным, то перейдут он за время самого медленного!
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.01.2017, 23:01   #8
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
А у Вас есть пример, на котором код неверно срабатывает, для которого известен верный ответ?
Нет, неизвестен

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
dimon_snake, а Вы время на возвращение учитывать не забываете?


думаю, что ошибка в этом.
на форуме была аналогичная задача про переход через мост.

нужно наоборот, быстрых оправлять вместе, а отдельно оправлять вместе медленных, а вот зонт возвращать самым быстрым.
Понятное ведь, если вы самого быстрого отправите вместе с самым медленным, то перейдут он за время самого медленного!
Не забываю
Вот в этой строке
Код:
kolvo:=kolvo+a[i]+min;
где a[i] - очередной человек, которого перевел самый быстрый, а min - самый быстрый
То есть до общего времени добавляем очередного, а потом самого быстрого, т.к. он возвращается за следующим
dimon_snake вне форума Ответить с цитированием
Старый 07.01.2017, 03:37   #9
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

dimon_snake
если нужно перейти 4-м человечкам.
первый переходит за 1 минуту
второй переходит за 2 минуты
третий переходит за 20 минут
четвёртый переходит за 20 минут

оптимальным будет, если сначала перейдут 1-й и 2-й (это 2 минуты),
потом первый вернётся ( это +1 минута),
потом перейдут вместе 3-й и 4-й (это + 20 минут)
потом вернётся 2-й (это +2 минуты)
и потом перейдут оставшиеся 1-й и 2-й (это +2 минуты).
итого 2+1+20+2+2 = 27 минут
а сколько минут выдаётся ваш код?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 07.01.2017, 15:52   #10
dimon_snake
Форумчанин
 
Регистрация: 05.11.2015
Сообщений: 167
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
dimon_snake
если нужно перейти 4-м человечкам.
первый переходит за 1 минуту
второй переходит за 2 минуты
третий переходит за 20 минут
четвёртый переходит за 20 минут

оптимальным будет, если сначала перейдут 1-й и 2-й (это 2 минуты),
потом первый вернётся ( это +1 минута),
потом перейдут вместе 3-й и 4-й (это + 20 минут)
потом вернётся 2-й (это +2 минуты)
и потом перейдут оставшиеся 1-й и 2-й (это +2 минуты).
итого 2+1+20+2+2 = 27 минут
а сколько минут выдаётся ваш код?
Да, действительно
Благодарю
dimon_snake вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Дано скорость лодки, скорость течения реки, время движения, определить путь S, пройденный лодкой (на Delphi) zhora-011 Помощь студентам 1 06.09.2013 22:05
Как создать детектор движения без dspack? ubun Мультимедиа в Delphi 0 03.01.2011 21:40
Скорость рисования и остальная скорость ZotaC Gamedev - cоздание игр: Unity, OpenGL, DirectX 121 13.11.2010 22:51
Как улеличивать скорость движения во время движия Нур Помощь студентам 9 23.12.2009 13:00
Скорость движения обьекта shepelin Общие вопросы Delphi 9 23.01.2008 11:51