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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.11.2014, 03:37   #1
Vitaer
Новичок
Джуниор
 
Регистрация: 22.11.2014
Сообщений: 6
По умолчанию Задача (Pascal/Delphi)

Здравствуйте.
У меня есть задача, которую необходимо решить. Я её решил, но, к сожалению, частично. Из того набора тестов, которые должна пройти моя программа четыре она пройти не может. Два по причине превышения лимита времени, два по причине ошибочного ответа. Если кто-нибудь мог бы указать на возможные критические точки (наборы входных данных) программы из-за которых появляются неправильные ответы и/или же указать способ оптимизации - я был бы крайне признателен. Текст задачи и программы прикладываю.

Задача:
Рассмотрим ряд натуральных чисел, для которого введём указатель актуальной позиции (POS). Так же введём две операции, которые могут быть выполнены на элементах ряда:
1) R - удаление элемента C ряда на позиции POS+1 и сдвиг POS на C позиций вправо.
2) X - вставка элемента C-1 на позицию POS+1, где C - Элемент на позиции POS.
Необходимо выписать ряд после T выполнений операций R и X, при условии, что если элемент на позиции POS чётный, то выполняем операцию R, в противном случае - Х. Начинаем от первого элемента ряда.
Так финальный ряд должен быть выписан от элемента на позиции POS до элемента на позиции POS-1.

Формат:
На вход подаётся ряд чисел. Первое - это T - число выполнений операций. Остальные - сам ряд, до знака EOF.
На выход необходимо выписать ряд после выоплнения всех операций, в виде указанном в условии. В случае если ряд пуст - вывести -1.

Примеры данных:
Вход:
3 1 2 3
Выход:
0 0 3 1

Вход:
8 5 1 2 3
Выход:
2 2

Вход:
50 378 31 239 351 192 135 143 100 115 398 176 140 468 295 124 32 379 438 62 200 313 92 450 75 294 338 459 344 56 162 455 307 311 432 209 458 51 475 360 187 88 489 238 326 175 180 358 254 198 79
Выход:
454 307 306 310 310 432 51 50 475 360 358 198 378 351 350 135 134 143 142 142 100 398 140 62 313 312 312 450 75 294 458 56

Код:
http://pastebin.com/gRWPr5GW
Vitaer вне форума Ответить с цитированием
Старый 22.11.2014, 15:02   #2
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Задача (Pascal/Delphi)
если можно юзать delphi, то TList решит все проблемы.
Цитата:
Код:
http://pastebin.com/gRWPr5GW
ЧЗХ?
Изображения
Тип файла: jpg 29.jpg (22.0 Кб, 132 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.11.2014, 17:31   #3
Vitaer
Новичок
Джуниор
 
Регистрация: 22.11.2014
Сообщений: 6
По умолчанию

Боюсь, что TList ипользовать нельзя.
Хм, странно, у меня этот сайт всегда спокойно открывался. Просто ресурс для передачи кода друг другу, и всё. Хорошо, вставляю код сюда.

Код:
Код:
program POS_nr;
var
arr: array [0..10000000] of Int64; //массив данных
t, checker: Integer; //количество выполнеинй
step, a_end, pos, j, i, temp: Int64;
//вспомогательные переменные, где step - сдвиг POS после выполнений операции, a_end - текущее количество элементов
 
procedure X();
begin
  inc(a_end);//увеличиваем количество элементов
  step:=arr[pos];
 
  i:=a_end;
  while i >= pos+2 do begin //свдигаем часть массива вправо
    arr[i]:=arr[i-1];
    dec(i);
  end;
  arr[pos+1]:=arr[pos]-1;  //вставляем новый элемент
 
  pos:=(pos + step) mod a_end; //вычисляем позицию POS
end;
 
procedure R();
begin
  dec(a_end);//уменьшаем количество элементов
  if a_end = 0 then exit;//если оно стало равным нулю - выходим
  if pos < a_end then temp:=pos+1 //вычисляем позицию которую будем удалять
  else temp:=0;
  step:=arr[temp];
 
  i:=temp;//удаляем
  while i <= a_end do begin
    arr[i]:=arr[i+1];
    inc(i);
  end;
 
  if pos <> a_end then pos:=(pos + step) mod a_end //вычисляем позицию POS
  else pos:=(step - 1) mod a_end;
end;
 
Begin
  a_end:=0;
  read(t);
  while not EOF do begin //заполняем массив
    read(arr[a_end]);
    inc(a_end);
  end;
  for checker:=1 to t do begin//выполнение операций
    if a_end = 0 then break;
    if arr[pos] mod 2 <> 0 then X()
    else R();
  end;
  if a_end <> 0 then begin
    j:=0;
    while j<=a_end-2 do begin //вывод по условию
        if pos+j<a_end then write(arr[pos+j],' ')
        else write(arr[pos+j-a_end],' ');
        inc(j);
    end;
    if pos = 0 then write(arr[pos+j])
    else write(arr[pos-1]);
  end
  else write(-1);
end.

Последний раз редактировалось Stilet; 22.11.2014 в 18:58.
Vitaer вне форума Ответить с цитированием
Старый 22.11.2014, 17:47   #4
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
arr: array [0..10000000] of Int64; //массив данных
76 мегабайт памяти. Это небходимо?
Цитата:
Боюсь, что TList ипользовать нельзя.
почему?

Ну и, конечно, Бонус!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.11.2014, 18:06   #5
Vitaer
Новичок
Джуниор
 
Регистрация: 22.11.2014
Сообщений: 6
По умолчанию

В первой версии программы было увеличение длинны массива динамически при помощи SetLength. После прогона тестов получил превышение лимита времени по всем тестам и убрал динмическое расширение.
Моя ошибка в шапке темы. Ещё раз проверил список доступных компиляторов - там только Pascal. Писал тему уже ночью, поэтому ошибся, прошу прощения.
Когда я отправлял код сюда он был отформатирован по правилам. Попробую приложить код файлом, может будет лучше.
Вложения
Тип файла: txt pos.txt (1.6 Кб, 137 просмотров)
Vitaer вне форума Ответить с цитированием
Старый 22.11.2014, 18:54   #6
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от Vitaer Посмотреть сообщение
В первой версии программы было увеличение длинны массива динамически при помощи SetLength. После прогона тестов получил превышение лимита времени по всем тестам и убрал динмическое расширение.
Моя ошибка в шапке темы. Ещё раз проверил список доступных компиляторов - там только Pascal. Писал тему уже ночью, поэтому ошибся, прошу прощения.
Когда я отправлял код сюда он был отформатирован по правилам. Попробую приложить код файлом, может будет лучше.
pascal тоже разный бывает. какой использовать в данном случае?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.11.2014, 19:01   #7
Vitaer
Новичок
Джуниор
 
Регистрация: 22.11.2014
Сообщений: 6
По умолчанию

Компилятор - fpc 2.2.4
Vitaer вне форума Ответить с цитированием
Старый 22.11.2014, 19:08   #8
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Сообщение от Vitaer Посмотреть сообщение
Компилятор - fpc 2.2.4
а 2.6.4 не подойдёт ли?
Изображения
Тип файла: png 30.png (91.4 Кб, 68 просмотров)
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 22.11.2014, 20:13   #9
Vitaer
Новичок
Джуниор
 
Регистрация: 22.11.2014
Сообщений: 6
По умолчанию

Думаю вполне подойдёт.
Я вообще ещё со школьных олимпиад всё пишу в PascalABC.NET - проблем пока не возникало.
Vitaer вне форума Ответить с цитированием
Старый 22.11.2014, 20:20   #10
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Я вообще ещё со школьных олимпиад всё пишу в PascalABC.NET - проблем пока не возникало.
выбрось фтопку, пора взрослеть.
качай лазарус. там есть TList и всё остальное.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Есть задача на pascal нужно в delphi переделать djgrif Общие вопросы Delphi 1 27.06.2013 09:04
Задача turbo pascal на тему: файлы с произвольным доступом в Pascal ExCiTeC Паскаль, Turbo Pascal, PascalABC.NET 0 28.01.2013 20:36
Задача по подсчёту статистики использования букв. Другая задача - по длинной арифметике Pascal ABC kimberly Паскаль, Turbo Pascal, PascalABC.NET 3 24.12.2012 17:03
Читатели библиотеки - задача на тип запись (record) в Pascal\Delphi Ski Помощь студентам 1 15.05.2012 21:43