Тренировка S10

Время тестирования приведено для Intel Celeron 400.
Решения должны быть представлены на Turbo Pascal 7.0. Объём памяти, предоставляемый программе, составляет 500 кб.


        Задача A. Анти-QuickSort

Для сортировки последовательности чисел широко используется быстрая сортировка - QuickSort. Далее приведена программа, которая сортирует массив a, используя этот алгоритм.
var
a : array [1..N] of integer;

procedure QSort(left, right : integer);
var
i, j : integer;
      key : integer;
      buf : integer;
begin
key := a[(left + right) div 2];
      i := left;
      j := right;
repeat
while a[i] < key do    {первый while}
            inc(i); 
while key < a[j] do    {второй while}
            dec(j); 
if i <= j then begin
buf := a[i];
            a[i] := a[j];
            a[j] := buf;
            inc(i);
            dec(j);
end;
until i > j;

if left < j then
QSort(left, j);
if i < right then
QSort(i, right);
end;

begin
...
   QSort(1, N);
end.
Хотя QuickSort является самой быстрой сортировкой в среднем, существуют тесты, на которых она работает очень долго. Оценивать время работы алгоритма будем количеством сравнений с элементами массива (то есть суммарным количеством сравнений в первом и втором while). Требуется написать программу, генерирующую тест, на котором быстрая сортировка сделает наибольшее число таких сравнений.
Ввод из файла antiqs.in. В первой строке находится единственное число N.
Ограничения: 1 <= N <= 70 000, время 1 с.
Вывод в файл antiqs.out. Вывести перестановку чисел от 1 до N, на которой быстрая сортировка выполнит максимальное число сравнений. Если таких перестановок несколько, вывести любую из них.
Примеры
Ввод 1
3
Вывод 1
1 3 2

        Задача B. Строки Фибоначчи

Строку Фибоначчи F(K) для натуральных чисел K определим так: F(1) = 'A', F(2) = 'B', F(K) = F(K - 1) + F(K - 2) при K > 2, где "+" означает конкатенацию строк. Требуется найти количество вхождений строки S, состоящей из символов A и B, в строку Фибоначчи F(N).
Ограничения: длина S от 1 до 25, 1 <= N <= 45, время 1 с.
Примечание. Длина F(45) равна 1 134 903 170.
Ввод из файла fibostr.in. В первой строке содержится число N, во второй - строка S.
Вывод в файл fibostr.out. Выводится одно число - количество вхождений строки S в строку Фибоначчи F(N).
Примеры
Ввод 1    Ввод 2    Ввод 3     Ввод 4
1         2         8          35
A         ABA       BBABAB     BBABAB
Вывод 1   Вывод 2   Вывод 3    Вывод 4
1         0         3          1346268

        Задача C. Игра в зачёркивание

Бумажная полоска разделена на N клеток. Двое играющих по очереди выбирают и зачёркивают ровно K пустых смежных клеток. Выигрывает сделавший последний ход. Оба игрока придерживаются правильной стратегии. Дана ситуация игры. Требуется определить, кто выиграет.
Ограничения: 1 <= K <= N <= 40, время 10 с.
Ввод из файла crossgam.in. В первой строке содержатся числа N и K, во второй строке N символов: латинская заглавная O - пустая клетка, латинская заглавная X - зачёркнутая клетка.
Вывод в файл crossgam.out. Вывести одно число: 1, если выиграет первый, сделавший ход; 2, если выиграет второй; 0, если ход сделать нельзя.
Примеры
Ввод 1    Ввод 2    Ввод 3
4 2       5 2       7 2
OOOO      OOOOO     OXXOXXO
Вывод 1   Вывод 2   Вывод 3
1         2         0

        Задача D. Граница многоугольника

Многоугольник на плоскости задан целочисленными координатами своих N вершин в декартовой системе координат. Требуется найти количество точек с целочисленными координатами, лежащих на границе многоугольника. Стороны многоугольника друг с другом не соприкасаются (за исключением соседних - в вершинах) и не пересекаются.
Ограничения: 3 <= N <= 100 000, координаты вершин целые и по модулю не превосходят 1 000 000 000, время 2 с.
Ввод из файла border.in. В первой строке содержится число N, в следующих N строках - пары чисел - координаты точек. Если соединить точки в данном порядке, а также соединить первую и последнюю точки, получится заданный многоугольник.
Вывод в файл border.out. Вывести одно число - количество точек с целочисленными координатами на границе многоугольника.
Примеры
Ввод 1
3
10 0
0 10
0 0
Вывод 1
30

        Задача E. Путь спелеолога

Пещера представлена кубом, разбитым на N частей по каждому измерению (то есть на N 3 кубических клеток). Каждая клетка может быть или пустой, или полностью заполненной камнем. Исходя из положения спелеолога в пещере, требуется найти, какое минимальное количество перемещений по клеткам ему требуется, чтобы выбраться на поверхность. Переходить из клетки в клетку можно, только если они обе свободны и имеют общую грань.
Ограничения: 1 <= N <= 30, время 1 с.
Ввод из файла speleo.in. В первой строке содержится число N. Далее следует N блоков. Блок состоит из пустой строки и N строк по N символов: # - обозначает клетку, заполненную камнями, точка - свободную клетку. Начальное положение спелеолога обозначено заглавной буквой S. Первый блок представляет верхний уровень пещеры, достижение любой свободной его клетки означает выход на поверхность. Выход на поверхность всегда возможен.
Вывод в файл speleo.out. Вывести одно число - длину пути до поверхности.
Примеры
Ввод 1
3

###
###
.##

.#.
.#S
.#.

###
...
###
Вывод 1
6
Комментарий 1
Нужно спуститься на уровень вниз,
сделать два движения на запад,
подняться на уровень вверх,
сделать движение на юг,
подняться на уровень вверх.

        Задача F. Дырявая ткань

На столе лежат несколько кусков ткани, не перекрывая друг друга. Эти куски могут иметь дыры, в том числе и настолько большие, что в них может поместиться целый кусок ткани. Был получен чёрно-белый образ поверхности стола, на котором области, покрытые тканью, представлены символами *, а свободные площади - точками. Один кусок ткани, таким образом, представлен 4-связной областью символов *, то есть группой *, соседствующих друг с другом горизонтально или вертикально, но не по диагонали.
.***..***
.*.*.**.*
.***.*.**
*...**.*.
На схеме три куска - один без дыр, а два - с одной дырой каждый: первый площадью 8, второй - площадью 12.

Ваша цель - найти кусок с наибольшим количеством дыр в нём. Дыра - это 4-связная область точек, полностью окружённых символами *. Если несколько кусков имеют одинаковое количество дыр, нужно выбрать кусок минимальной площади.

Ввод из файла holey.in. В первой строке содержатся два числа W и H, разделённые пробелами. Следующие H строк содержат по W символов каждая. Символы в этих строках - или * (ASCII 42), или точка (ASCII 46).

Ограничения: 1 <= WH <= 100, время 1 с.

Вывод в файл holey.out. Вывести одно целое число - площадь минимального из наиболее дырявых кусков. Если нет кусков с дырами, выходной файл должен содержать ноль.

Примеры
Ввод 1
9 5
.********
.*......*
.*..**..*
.*......*
.********
Вывод 1
22
Hosted by uCoz