Центральный Дом Знаний - Лекции по структурам и алгоритмам обработки данных (СиАОД) 8

Информационный центр "Центральный Дом Знаний"

Заказать учебную работу! Жми!



ЖМИ: ТУТ ТЫСЯЧИ КУРСОВЫХ РАБОТ ДЛЯ ТЕБЯ

      cendomzn@yandex.ru  

Наш опрос

Как Вы планируете отдохнуть летом?
Всего ответов: 922

Онлайн всего: 1
Гостей: 1
Пользователей: 0


Форма входа

Логин:
Пароль:

Лекции по структурам и алгоритмам обработки данных (СиАОД) 8

Лекции по структурам и алгоритмам обработки данных (СиАОД)

стр.: 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

Полный текст лекций можно скачать здесь

4.5. Маршрут (6)

Дана матрица N N, заполненная положительными числами. Путь по матрице начинается в левом верхнем углу. За один ход можно пройти в соседнюю по вертикали или горизонтали клетку (если она существует). Нельзя ходить по диагонали, нельзя оставаться на месте. Требуется найти максимальную сумму чисел, стоящих в клетках по пути длиной K клеток (клетку можно посещать несколько раз).

Ограничения: 2 ≤ N ≤ 20, элементы матрицы имеют значения от 1 до 9999, 1 ≤ K ≤ 20, все числа целые, время 2 с.

Ввод из файла INPUT.TXT. В первой строке находятся разделенные пробелом числа N и K. Затем идут N строк по N чисел в каждой.

Вывод в файл OUTPUT.TXT. Вывести в первой строке максимальную сумму, а во второй – соответствующий маршрут в виде координат клеток.

Пример

Ввод
5 7
1 1 1 1 1
1 1 3 1 9
1 1 6 1 1
1 1 3 1 1
1 1 1 1 1
Вывод
21
(1,1) (1,2) (1,3) (2,3) (3,3) (4,3) (3,3)

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

4.6. Золотоискатели (6)

За два года беспрерывной работы артель золотоискателей "Вперед к капитализму!", состоящая из трех человек, добыла N самородков. Несмотря на то, что до конца вахты оставался еще целый год, один из золотоискателей решил уехать - на Большой Земле у него родился сын. Артельщики решили выдать отъезжающему ровно третью часть добытого золота.

Вам надо написать программу, которая находит набор самородков, вес которого составляет третью часть от веса всего добытого золота, либо определить что это невозможно.

Ввод из файла INPUT.TXT. В первой строке записано целое число N - количество добытых самородков (1 N 500). Во второй строке заданы через пробел N целых чисел Mi (1 Mi 1000) - веса добытых самородков.

Вывод в файл OUTPUT.TXT. Если набор составить возможно, то в первой строке выведите K - количество самородков в наборе, а затем K чисел, задающих номера самородков, входящих в набор. Если существует несколько ответов, то выведите любой из них. Если набор составить невозможно, то выведите число 0.

Примеры

Ввод 1 Ввод 2
8 3
1 3 4 1 2 5 1 1 1 5 6
Вывод 1 Вывод 2
2 0
6 8

4.7. Скобочки (7)

Найти количество правильных скобочных форм из скобок "(” и ”)” заданной глубины. Задаются два целых числа: N – число открывающих скобок (т.е. 2N – длина выражения) и k – глубина (1 ≤ kN ≤ 50).

Ввод из файла INPUT.TXT. В единственной строке находятся числа N и k через пробел.

Вывод в файл OUTPUT.TXT. Вывести одно число - количество различных значений сумм.

Примеры

Ввод 1 Ввод 2

3 2 37 23

Вывод 1 Вывод 2

3 203685956218528

Подсказка. Обозначим через Si количество форм с текущей глубиной k в позициях от 1 до i при условии, что большей глубины не было. Тогда для каждой такой формы существует S2N - i способов правильного закрытия скобок. Значит, выражение SiS2N - i дает количество правильных форм, когда глубина k достигается в i-й позиции. Может показаться, что если известны все значения Si, то достаточно просуммировать такие произведения для всех допустимых значений i, то есть при ki ≤ 2N - k. Это не совсем так, поскольку некоторые формы могут повторяться. Как с этим бороться?


4.8. Булева функция (6)

Недавно на уроке информатики ученики одного из классов изучили булевы функции. Напомним, что булева функция f сопоставляет значениям двух булевых аргументов, каждый из которых может быть равен 0 или 1, третье булево значение, называемое результатом. Для учеников, которые выразили желание более подробно изучать эту тему, учительница информатики на дополнительном уроке ввела в рассмотрение понятие цепного вычисления булевой функции f.

Если задана булева функция f и набор из N булевых значений a1a2, ..., aN , то результат цепного вычисления этой булевой функции определяется следующим образом:

  • если N = 1, то он равен a1;

  • если N > 1, то он равен результату цепного вычисления булевой функции f для набора из (N–1) булевого значения f(a1,a2), a3, …, aN, который получается путем замены первых двух булевых значений в наборе из N булевых значений на единственное булево значение – результат вычисления функции f от a1 и a2.

Например, если изначально задано три булевых значения: a1 = 0, a2 = 1, a3 = 0, а функция f – ИЛИ (OR), то после первого шага получается два булевых значения (0 OR 1) и 0, то есть 1 и 0. После второго (и последнего) шага получается результат цепного вычисления, равный 1, так как 1 OR 0 = 1.

В конце дополнительного урока учительница информатики написала на доске булеву функцию f и попросила одного из учеников выбрать такие N булевых значений ai, чтобы результат цепного вычисления этой функции был равен единице. Более того, она попросила найти такой набор булевых значений, в котором число единиц было бы как можно большим.

Требуется написать программу, которая решала бы поставленную учительницей задачу. Использовать подход динамического программирования.

Ввод из файла INPUT.TXT. Первая строка содержит одно натуральное число N (2  N  100 000). Вторая строка содержит описание булевой функции в виде четырех чисел, каждое из которых – ноль или единица. Первое из них есть результат вычисления функции в случае, если оба аргумента – нули, второе – результат в случае, если первый аргумент – ноль, второй – единица, третье – результат в случае, если первый аргумент – единица, второй – ноль, а четвертый – в случае, если оба аргумента – единицы.

Вывод в файл OUTUT.TXT. Необходимо вывести строку из N символов, определяющих искомый набор булевых значений ai с максимально возможным числом единиц. Если ответов несколько, требуется вывести любой из них. Если такого набора не существует, выведите в выходной файл слово No.

Примеры

Ввод 1 Ввод 2 Ввод 3

4 5 6

0110 0100 0000

Вывод 1 Вывод 2 Вывод 3

1011 11111 No

Пояснения к примерам

В первом примере процесс вычисления цепного значения булевой функции f происходит следующим образом:

1011 → 111 → 01 → 1

Во втором примере вычисление цепного значения булевой функции f происходит следующим образом:

11111 → 0111 → 111 → 01 → 1

В третьем примере получить цепное значение булевой функции f, равное 1, невозможно.

7. Заметание

Рассмотрим следующую задачу.

Закраска прямой. На числовой прямой окрасили N отрезков. Известны координаты левого и правого концов каждого отрезка (Li и Ri). Найти длину окрашенной части числовой прямой.

Ограничения: Li и R i - целые, -1000 Li Ri 1000, 1 N ≤ 1000, время 1 с.

Ввод из файла INPUT.TXT. В первой строке находится число N, в следующих N строках - пары Li и R i .

Вывод в файл OUTPUT.TXT. Вывести одно число – длину окрашенной части прямой.

Примеры

Ввод 1 Ввод 2

2 1

1 3 10 10

2 4

Вывод 1 Вывод 2

3 0


Отсортируем концы отрезков по возрастанию. Будем просматривать отсортированный массив слева направо, прибавляя к счетчику 1 в случае начала отрезка, и вычитая 1 для конца отрезка. Если счетчик получает значение 1 в начале очередного отрезка , запомним соответствующее значение координаты L. Если счетчик становится равным 0 в некотором конце отрезка с координатой R, то очередное объединение отрезков закончилось, и точки до следующего начала отрезка не принадлежат ни одному отрезку. Прибавляем величину R-L к общей длине окрашенной части.

Приведем текст программы для решения этой задачи.


Program PaintX;

Const

Max=2000;

Type

Segm=record

X: integer; {координата}
Vid: integer; {1-левый конец, -1-правый}
end;

Var

M,N,i,j,K,L: integer;
Lp: longint; {общая длина окрашенной части прямой}
S: array [1..Max] of Segm;

Fin,Fout: text;

Procedure Sort; {сортировка на месте}

Var

i,j: integer;

B: Segm;

Begin

For i:=2 to K do

For j:=K downto i do { пузырек }
if (S[j].X<S[j-1].X) then
begin

B:=S[j];

S[j]:=S[j-1];

S[j-1]:=B;

end;

End;


Begin

Assign(Fin,'input.txt');

Reset(Fin);

ReadLn(Fin,N);

K:=0; {число концов}
For i:=1 to N do

begin

K:=K+2;

ReadLn(Fin,S[K-1].X,S[K].X);

S[K-1].Vid:=1; {признак левого конца}
S[K].Vid:=-1; {признак правого конца}
end;
Close(Fin);
Sort;
Lp:=0; {общая длина окрашенной части прямой}
M:=0; {количество отрезков, содержащих текущую координату}

For i:=1 to K do

begin

M:=M+S[i].Vid;

if (M = 1) and (S[i].Vid = 1) then L:=S[i].X;

if (M = 0) and (S[i].Vid = -1) then Lp:=Lp+S[i].X-L;

end;

Assign(Fout,'output.txt');

Rewrite(Fout);
Write(Fout,Lp);
Close(Fout);
End.

При увеличении размерности необходимо использовать один из вариантов быстрой сортировки.

В рассмотренной задаче мы продвигаемся по числовой прямой, обрабатывая два вида событий: начало и конец какого-либо отрезка. Между точками событий принципиально ничего не изменяется.

Подобный подход называют методом заметания (выметания, скользящей прямой, sweeping) [3]. Обычно он включает в себя следующие этапы:

  • выделение точек событий;

  • сортировка точек событий;

  • последовательное продвижение по точкам событий с обработкой точек в зависимости от вида событий.

В нашей задаче всего два вида событий, но их может быть и больше. Приведем пример более сложной задачи на заметание.

Волки и овцы. На координатной плоскости заданы отрезками N волков и M овец. Пастух с ружьем находится в начале координат. Выстрел поражает всех животных по направлению полета пули. Найти наименьшее число выстрелов для того, чтобы убить всех волков и не тронуть овец.

Ввод из файла INPUT.TXT. В первой строке задаются через пробел значения N и M (1 ≤ N, M ≤ 103). В следующих N строках - целочисленные координаты начала (X1, Y1) и конца (X2, Y2) отрезка, соответствующего волку (-1000 ≤ X1, X2 ≤ 1000; 1 ≤Y1, Y2 ≤ 1000). Аналогично в следующих M строках указывается положение овец.

Вывод в файл OUTPUT.TXT единственного целого числа либо сообщения "No solution”.

Пример

Ввод

2 1

1 1 2 3

-5 4 2 2

999 1000 1000 9993

Вывод

2

Каждое животное определяет сектор своего нахождения. Как начало, так и конец любого отрезка находятся в пределах интервала углов (0, π). Поставим в соответствие сектору нахождения животного отрезок, определяемый котангенсами координат начала и конца того отрезка, который задает положение животного. Поменяем при необходимости начало и конец отрезка котангенсов так, чтобы левая граница отрезка не превосходила правую. Все отрезки котангенсов окажутся в пределах [-1000; 1000]. Такое соответствие позволяет вместо отрезков на плоскости рассматривать отрезки котангенсов на числовой прямой.

Сформируем из исходных данных массив записей размерности (N+M)2, в котором будем хранить информацию о началах и концах отрезков котангенсов. Структура записи в терминах языка Паскаль:

Type

Point=record

X: real; {координата в пределах [-1000; 1000]}

Vid: char; {‘[’ для левого конца и ‘]’ для правого}

Pr: char; {‘w’-волк, ’s’-овца}

Ind: integer; {индекс в массиве парной скобки}

End;

Отсортируем массив по возрастанию координат. При равных координатах выберем следующий порядок расположения в массиве:

  • начало отрезка для овцы;

  • начало отрезка для волка;

  • конец отрезка для волка;

  • конец отрезка для овцы.

При сортировке будем корректировать значения переменной Ind в соответствии с изменениями индексов элементов в массиве.

Loading

Календарь

«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Архив записей

Друзья сайта

  • Заказать курсовую работу!
  • Выполнение любых чертежей
  • Новый фриланс 24