Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/34: Рейтинг темы: голосов - 34, средняя оценка - 4.65
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56

Уменьшить время выполнения программы

20.02.2016, 18:08. Показов 6802. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, мне дана задача, на решение которой дан лимит по времени: 400ms. В моем решении на больших числах программа выполняется 401 - 402ms. Тоесть на одну - две милисекунды дольше чем нужно и поэтому задача не проходит. Обидно не правда ли? Помогите мне что то изменить в решении, чтобы программа выполнялась немного быстрее.

Условие
При хранении данных на жестких дисках типа HDD данные группируются по секторам. Все файлы разбиваются на фрагменты, которые в свою очередь записываются в некоторых секторах жесткого диска. При этом сектора, в которых находится один файл не обязательно следуют друг за другом и могут располагаться в произвольном порядке.
Одной из проблем HDD-носителей является то, что магнитная головка должна перемещаться от одного сектора к другому, чтобы считать один файл.
Вам требуется определить время за которое будет считан файл, разбитый на n фрагментов. В i-м секторе записан фрагмент файла номер fi (1<=fi<=n). При этом в различных секторах находятся в различные фрагменты. Будем считать, что изначально магнитная головка находится в секторе, в котором записан первый фрагмент. Считывание происходит следующим образом: сначала считывается первый фрагмент, затем магнитная головка перемещается к сектору, содержащему второй фрагмент, считывается второй фрагмент и так далее пока не будет считан n-й фрагмент. Фрагменты считываются один за другим по порядку от 1-го до n-го.
На перемещение магнитной головки от a-го сектора до b-го уходит |a-b| единиц времени. Временем считывания информации можно пренебречь.


Решение
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
var a,b,w,f:array[1..200000] of longint;
p,n,i,k,l,sch, nom:longint;
begin
read(n);
for i:=1 to n do
begin
read(a[i]); b[i]:=a[i]; end;
for l:=1 to n-1 do
for i:=l+1 to n do
if a[l] >  a[i] then
begin
p:=a[l];
a[l]:=a[i];
a[i]:=p;
end;
i:=1; l:=1;
while (i<=n) and (l<=n+1) do
begin
if a[i]=b[l] then w[i]:=l; 
l:=l+1;
if l=n+1 then begin i:=i+1; l:=1; end;
end;
sch:=0;
for i:=2 to n do
sch:=sch+abs(w[i]-w[i-1]);
writeln(sch);
end.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.02.2016, 18:08
Ответы с готовыми решениями:

Уменьшить время выполнения программы
У меня есть программа var n,i:integer; begin read(n); for i:=1 to n do if n mod i = 0 then write(i,' '); end. ...

Определить время выполнения программы
uses crt; var a:array of integer; i,k,n:integer; begin writeln('n='); readln(n); for i:=1 to n do begin ...

Как закрыть граф. модуль во время выполнения программы
Как закрыть граф. модуль во время выполнения программы? Я написал большой код, но забыл сохранить его и нажал запустить. Код содержит ...

15
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
20.02.2016, 18:59
А зачем сортировать, если
Цитата Сообщение от GreenFoxer Посмотреть сообщение
Считывание происходит следующим образом: сначала считывается первый фрагмент, затем магнитная головка перемещается к сектору, содержащему второй фрагмент, считывается второй фрагмент и так далее пока не будет считан n-й фрагмент. Фрагменты считываются один за другим по порядку от 1-го до n-го.
Т.е. без оптимизации перемещения головки?

Добавлено через 47 секунд
И каковы ограничения на диапазоны значений переменных?
0
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56
20.02.2016, 19:12  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
И каковы ограничения на диапазоны значений переменных?
2*10^5
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
20.02.2016, 19:19
Нашёл эту задачу с примерами и пояснениями.
Для её решения нужно получить список секторов файла, упорядоченных по возрастанию номера фрагмента, в то время как на входе - последовательность, упорядоченная по номеру сектора.

Наверное нужно считывать в массив так
Pascal
1
2
3
4
5
6
7
8
9
10
  readln(n);
  for i:=1 to n do
  begin
    read(fi);
    a[fi]:=i;
  end;
а теперь обработка
  t:=0;
  for i:=2 to n do
    t:=t+abs(a[i]-a[i-1]);
0
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56
20.02.2016, 19:30  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Нашёл эту задачу с примерами и пояснениями.
Ты не совсем правильно понял задачу. считывание идет не по порядку, а от меньшего символа к большему.
Например цикл: 2 4 5 1...
нужно начинать с 1, тоесть с четвертого номера, потом 2, тоесть 1 номер и так далее. А потом обработка t:=t+abs(1-4)
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
20.02.2016, 19:44
Ну, не "ты", а "вы". А во вторых - правильно понял, и правильно реализовал.
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
program test;
 
var
  a: array of dword;
  i, n, fi, t: dword;
begin
  Assign(input, '612b.txt');
  reset(input);
  readln(n);
  setlength(a, n);
  for i := 1 to n do
  begin
    Read(fi);
    a[fi - 1] := i;
  end;
 
  for i := 0 to n - 1 do
    Write(a[i]: 3);
  writeln;
 
  t := 0;
  for i := 1 to n-1 do
    t := t + abs(a[i] - a[i - 1]);
  writeln(t);
end.
для входных данных
Code
5
1 3 5 4 2
получаю 10 - как в пояснении к задачи.
0
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56
20.02.2016, 20:54  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
правильно реализовал
Dword??? Что это вообще за тип данных. Например ABC Pascal с таким кодом вообще не компилирует...
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
20.02.2016, 21:11
Longint-а хватит за глаза.

Добавлено через 9 минут
Цитата Сообщение от GreenFoxer Посмотреть сообщение
Dword??? Что это вообще за тип данных
Двойное беззнаковое целое. ABC Pascal много чего не компилирует, что ж тут поделаешь...
0
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56
20.02.2016, 21:24  [ТС]
Цитата Сообщение от bormant Посмотреть сообщение
ABC Pascal много чего не компилирует
А можно версию, чтобы скомпилировало?
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
20.02.2016, 21:56
Цитата Сообщение от bormant Посмотреть сообщение
Longint-а хватит за глаза.
Заменить dword на longint

Добавлено через 8 минут
А простой вопрос - на том сайте среди компиляторов присутствует Pascal ABC?
0
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56
20.02.2016, 21:57  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Заменить dword на longint
А что за файл считывается? (612b)
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
20.02.2016, 22:19
Я привёл не готовый для сдачи код, а продемонстрировал алгоритм. Чтобы не набирать каждый раз исходные данные во время отладки - сохранил их в файл.
Вы можете самостоятельно переработать этот пример.

Добавлено через 15 минут
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
program test;
 
var
  a: array of longint;
  i, n, fi, t: longint;
begin
  readln(n);
  setlength(a, n);
  for i := 1 to n do
  begin
    Read(fi);
    a[fi - 1] := i;
  end;
  t := 0;
  for i := 1 to n - 1 do
    t := t + abs(a[i] - a[i - 1]);
  writeln(t);
end.
0
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56
20.02.2016, 23:34  [ТС]
Да, действительно работает. Благодарю.

Добавлено через 10 минут
Цитата Сообщение от GreenFoxer Посмотреть сообщение
Да, действительно работает.
Хотя все равно проходит не все тесты. На одном из тестов происходит выход за границы допустимых значений.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
20.02.2016, 23:46
Цитата Сообщение от GreenFoxer Посмотреть сообщение
В моем решении на больших числах программа выполняется 401 - 402ms. Тоесть на одну - две милисекунды дольше чем нужно и поэтому задача не проходит. Обидно не правда ли?
Всего на одну-две, скорее всего, только потому, что по истечении отведённого времени программа прибивается. Сколько бы она на самом деле работала - неизвестно.
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4490 / 1669
Регистрация: 01.02.2015
Сообщений: 13,898
Записей в блоге: 12
21.02.2016, 08:42
Лучший ответ Сообщение было отмечено GreenFoxer как решение

Решение

Цитата Сообщение от GreenFoxer Посмотреть сообщение
На одном из тестов происходит выход за границы допустимых значений.
Увеличить разрядность t до int64.
1
1 / 1 / 1
Регистрация: 26.04.2015
Сообщений: 56
21.02.2016, 11:26  [ТС]
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Увеличить разрядность t до int64.
Да, спасибо, работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.02.2016, 11:26
Помогаю со студенческими работами здесь

Уменьшить время работы компилятора
var a, a2: string; i, k: integer; begin read(a); for i := 1 to length(a) do begin a2 := copy(a, i, 1); ...

Время выполнения блока кода
Здравствуйте. Подскажите пожалуйста как получить время выполнения блока кода, например процедуры, в миллисекундах.

Как задать время выполнения команды?
Нужно что бы следующая команда выполнялась спустя некоторое (заданное) время. Как это реализовать?

Как ввести строки с клавиатуры во время выполнения оператора case?
Впервые столкнулся с такой проблемой, нужно было считать строку во время работы case-а, но программа автоматически пропускает оператор...

Почему после выполнения программы х = 10?
Всем привет, если кто может, пожалуйста объясните почему после выполнения программы х = 10. Спасибо заранее. program a1; procedure...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru