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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.04.2017, 21:19   #1
Юрий12
 
Регистрация: 05.04.2017
Сообщений: 8
Вопрос [Pascal ABC] Марафон.Жадный

ПОМОГИТЕ ПОЖАЛУЙСТА
Уже много раз пытался нечего не получается,НО точно знаю что связано с
Жадным алгоритмом и что-то с unix.
Помогите пожалуйста(для паскаля abc)



Заданы результаты марафона в следующем виде. Имеется N (1 <= N <= 5,000)
времен завершения бега в форме часы : минуты : секунды (0 <= часы <= 99),
(0 <= минуты <= 59), (0 <= секунды <= 59). Надо отсортировать эти времена в порядке возрастания.

Например для результатов

11:20:20
11:15:12
14:20:14

Правильный итог сортировки таков:

11:15:12
11:20:20
14:20:14


Формат ввода

* Строка 1: Одно целое число: N
* Строки 2..N+1: Строка i+1 содержит время как три целых числа, разделенных
пробелами: часы минуты секунды

Пример ввода
3
11 20 20
11 15 12
14 20 14

Формат вывода

* строки 1..N: Каждая строка содержит время, заданное тремя
целыми числами, разделенными пробелами

Пример вывода
11 15 12
11 20 20
14 20 14
Юрий12 вне форума Ответить с цитированием
Старый 05.04.2017, 21:28   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от Юрий12 Посмотреть сообщение
связано с Жадным алгоритмом
и? что непонятно? посмотрите примеры/описания.


Цитата:
Сообщение от Юрий12 Посмотреть сообщение
что-то с unix
Видимо имелось в виду, что время надо преобразовывать в одно число для удобства.

unix time — количество секунд прошедших с 00:00:00 01.01.1970
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 05.04.2017, 21:44   #3
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

и как Вы пытались?
Переведите время в секунды, отсортируйте массив секунд и обратно секунды переведите в время.
Код:
begin
  var h:=11;
  var m:=15;
  var s:=12;
  var time:=h*3600+m*60+s;
  writeln(time);
  writeln(time div 3600);
  writeln(time mod 3600 div 60);
  writeln(time mod 60);
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Старый 05.04.2017, 22:03   #4
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Юрий12
Цитата:
НО точно знаю что связано с Жадным алгоритмом и что-то с unix.
На мой неопытный взгляд - это просто выражение непонимания и страха...
Что дано:
Цитата:
3 {число записей}
11 20 20 {чч мм сс}
11 15 12
14 20 14
Что сделать -
Цитата:
Надо отсортировать эти времена в порядке возрастания.
В чем проблема:
ТС не знает, что в одном часе 60 минут, а в одной минуте 60 сек.
Читаем строки из файла.
1. Читаем первую строку
Код:
readln(fhi, N); {fhi - файловая переменная, N - число записей}
for i := 1 to N do {в цикле читаем остальные строки}
begin
   readln(fhi, hh, mm, ss); {hh - число часов, mm - число минут, ss - число секунд}
   mas[i] := (hh * 60 + mm) * 60 + ss; {сохранили результат в массиве}
end;
{Тут надо написать нужную сортировку. Думаю на форуме их ...}
{Вывод данных}
for i := 1 to N do
begin
   ss := mas[i] MOD 60 {число секунд}
   tt := mas[i] DIV 60 {минуты и часы}
   mm := tt MOD 60; {число минут}
   hh := tt DIV 60; {число часов}
   writeln(fho, hh:2, ' ',mm:2, ' ',ss:2); {вывод результата в файл}
                                    {fho - файловая переменная - файл для записи} 
end;
PS: Ну, да, да - это Паскаль, а не Паскаль АВС. Но если там что-то не так, то перевод не должен составить труда.
Ведь
Цитата:
Уже много раз пытался нечего не получается,...
но ведь пытался.

Опять не успел ...
Как-то так, ...
ViktorR на форуме Ответить с цитированием
Старый 06.04.2017, 06:56   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

В таком строковом формате время вообще можно в число и обратно не преобразовывать. Или сравнение строк на запрете?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 06.04.2017, 10:15   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,238
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
В таком строковом формате время вообще можно в число и обратно не преобразовывать. Или сравнение строк на запрете?
да нет, думаю, что сравнение строк не подходит (напрямую),
т.к. это, похоже, пример непрезентативный выбран.

в условии задано:
Цитата:
Формат ввода

* Строка 1: Одно целое число: N
* Строки 2..N+1: Строка i+1 содержит время как три целых числа, разделенных
пробелами: часы минуты секунды
не слова не сказано про ведущие нули.

поэтому, я бы написал такой пример:
Дано
5
11 5 10
11 11 11
9 17 11
9 17 5
9 9 9

на выходе нужно получить:
9 9 9
9 17 5
9 17 11
11 5 10
11 11 11

p.s. но, конечно, если при чтении строк со временем в строке дополнять однозначные числа слева одним пробелом - то можно и строки сортировать.
а при выводе лишние пробелы можно легко удалять.
но вариант с числами имхо, предпочтительней - для хранения времени в строковом виде потребуется 8 байт (не считая служебные байты, вроде длины строки),
я для хранения числа LongInt - 4 байта. это и места в памяти в два раза меньше и сортировка будет работать чуть-чуть эффективней.
Недостаток, конечно, потери времени на преобразование из строки в число и обратное, при выводе отсортированного списка.
Но, думаю, что для 5000 строк это время намного меньше, чем собственно время чтения/записи (I/O) входных/выходных данных.

Последний раз редактировалось Serge_Bliznykov; 06.04.2017 в 10:24.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.04.2017, 12:17   #7
Plague
Забанен
Форумчанин Подтвердите свой е-майл
 
Аватар для Plague
 
Регистрация: 01.11.2006
Сообщений: 420
По умолчанию

Вариант 1
Код:
begin
  var n:=readinteger;
  var a:=ArrGen(n,i->3600*ReadInteger+60*ReadInteger+ReadInteger);
  a.Sort;
  a.ForEach(i->println(i div 3600,i mod 3600 div 60, i mod 60));
end.
Вариант 2 (через строки)
Код:
begin
  var n:=readinteger;
  var a:=ArrGen(n,i-> format('{0:00}:{1:00}:{2:00}',ReadInteger,ReadInteger,ReadInteger));
  a.Sort;
  a.Println(NewLine);
end.
Если ничто другое не помогает, прочтите, наконец, инструкцию! Аксиома Кана
Plague вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Построить алгоритм в виде блок-схем и написать соответствующую программу на языке Pascal / Pascal ABC IgorMyakota Паскаль, Turbo Pascal, PascalABC.NET 9 06.03.2014 07:32
pascal abc, pascal turbo. выборка данных из одного .txt в другой ТипичныйСтудент Помощь студентам 6 27.04.2013 15:29
Программы в Pascal, среда pascal ABC. Лабораторные работы Одинокая Волчица Фриланс 8 10.02.2012 20:09
Неудобство ABC Pascal и глюк Borland Pascal proser93 Помощь студентам 0 19.11.2011 19:01
Turbo Pascal or Pascal ABC Ikram Паскаль, Turbo Pascal, PascalABC.NET 0 27.04.2010 13:44