Олимпиадная задача - Pascal (80318)

Узнай цену своей работы

Формулировка задачи:

На вход в файле INPUT.TXT подаётся две строчки: N - количество томов(максимум 32) и (от 1 до N)порядок томов книг Нужно найти и вывести в файл OUTPUT.TXT

минимальное количество переставлений

, чтобы все тома были расположены в порядке

возрастания

, при условии, что только можно

брать любой том и ставить его последним

.

Пример:

INPUT.TXT

5 2 1 3 4 5

Output.txt

4 Сортировка происходит таким образом: 2 1 3 4 5 1. 1 3 4 5 2 2. 1 4 5 2 3 3. 1 5 2 3 4 4. 1 2 3 4 5

ещё пример

Input.txt

5 1 3 4 2 5

Output.txt

3 Так: 1.1 4 2 5 3 2.1 2 5 3 4 3.1 2 3 4 5 Собственно говоря, каким образом можно решить эту задачу?Самому отсортировать несложно, но как это описать алгоритмом?
Вообщем, кому интересно.На stackoverflow подсказали, что на каждом шаге надо находить минимальный том, стоящий не на своем месте, и ставить его в конец."на своем месте" - то есть в порядке возрастания. для второго примера при первом шаге стоят в порядке возрастания 1 2 5 . 3 - минимальное, которое стоит не в порядке возрастания.соответственно 3 и ставим в конец.вот таким образом я смог решить задачу:
Листинг программы
  1. var
  2. n:integer;
  3. a:array [1..33] of integer;
  4. input:text;
  5. output:text;
  6. current_index:integer;
  7. minimal:integer;
  8. index:integer;
  9. coint:integer;
  10. nonFounded:boolean;
  11. //процедура сдвига массива
  12. procedure offset_massive(index_first:integer);
  13. begin
  14. for var i:=index_first to N do
  15. a[i]:=a[i+1];
  16. end;
  17.  
  18. procedure poisk();
  19. begin
  20. current_index:=0;
  21. for var i:=1 to N do
  22. begin
  23. Nonfounded:=true;
  24. minimal:=i;
  25. for var j:=1+current_index to N do
  26. begin
  27. if i=a[j] then begin Nonfounded:=false;current_index:=j; break; end;
  28. end;
  29. if Nonfounded then break;
  30. end;
  31. if nonFounded then begin
  32. for var l:=1 to N do if minimal=a[l] then begin index:=l; end;
  33. a[n+1]:=minimal;
  34. coint:=coint+1;
  35. offset_massive(index);
  36. poisk();
  37. end;
  38. end;
  39. begin
  40. coint:=0;
  41. assign(input,'INPUT.TXT');
  42. reset(input);
  43. Readln(input,N);
  44. for var i:=1 to N do
  45. begin
  46. Read(input,a[i]);
  47. end;
  48. poisk();
  49.  
  50. assign(output,'OUTPUT.TXT');
  51. Rewrite(output);
  52. Writeln(output,coint);
  53. close(input);
  54. close(output);
  55. end.

Решение задачи: «Олимпиадная задача»

textual
Листинг программы
  1. var i, k, n: integer;
  2.     a: array[1..32] of integer;
  3.     f: text;
  4. begin
  5.   assign(f, 'input.txt');
  6.   reset(f);
  7.   readln(f, n);
  8.   k := 1;
  9.   for i := 1 to n do
  10.     begin
  11.       read(f, a[i]);
  12.       if a[i] = k then inc(k)
  13.     end;
  14.   close(f);
  15.   assign(f, 'output.txt');
  16.   rewrite(f);
  17.   writeln(f, n - k + 1);
  18.   close(f)
  19. end.

Объяснение кода листинга программы

  1. Объявляются переменные:
    • i - целого типа, используется в цикле для индексации;
    • k - целого типа, счетчик, инициализируется значением 1;
    • n - целого типа, хранит количество элементов.
  2. Объявляется массив:
    • a - массив из 32 элементов целого типа.
  3. Открывается файл input.txt.
  4. Считывается значение переменной n из файла input.txt.
  5. Устанавливается начальное значение счетчика k равное 1.
  6. Выполняется цикл от 1 до n:
    • Читается элемент массива a из файла input.txt и сохраняется в a[i].
    • Если значение a[i] равно k, увеличивается значение k на 1.
  7. Файл input.txt закрывается.
  8. Открывается файл output.txt.
  9. Выполняется перезапись файла output.txt.
  10. В файл output.txt записывается результат вычисления выражения n - k + 1.
  11. Файл output.txt закрывается. Код осуществляет чтение из файла input.txt, подсчет количества элементов массива, а затем запись результата в файл output.txt.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 3.417 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут