- •Оценка эффективности алгоритмов
- •Целочисленная арифметика
- •Дано натуральное число. Выяснить является ли оно палиндромом, то есть читается справа налево и слева направо одинаково
- •Дано натуральное число. Выяснить соотношение между количествами двоек и пятерок в этом числе
- •Найти самую большую и самую маленькую цифры данного натурального числа
- •Выяснить образуют ли цифры натурального числа возрастающую последовательность
- •Формат входного файла
- •Формат выходного файла
- •Формат входного файла
- •Формат выходного файла
- •Формат входного файла
- •Формат выходного файла
- •Длинная арифметика
- •Выходные данные
- •Задачи Задача 52 Иностранные земли
- •Входные данные.
- •Выходные данные.
- •Формат входного файла
- •Формат выходного файла
- •Задачи Задача 56 Уравнение
- •Решение
- •Одномерные массивы
- •Базовые задачи на массивы
- •Задача 15 Сокращение одночленов
- •Входные данные:
- •Задача 16 Школьный субботник
- •Входные данные:
- •Входные данные:
- •Выходные данные:
- •Примеры
- •Задача 27 Решение систем линейных уравнений на Pascal
- •Двумерные массивы
- •Описание массива
- •Способы создания массива
- •Задачи:
- •Задача 5 Малыш играет в "Морской бой 2" Малыш играет в "Морской бой". Поле для игры представляет собой квадрат
- •Входные данные
- •Выходные данные
- •Задача 26 Шарик в лабиринте
- •Примечание
- •Задача 27 Блохи
- •В первой строке входного файла Input.Txt находится 5 чисел, разделенных пробелом: n, m, s, t, q.
- •Входные данные
- •Выходные данные
- •Примеры
- •Задача 34 Магический квадрат
- •Формат входного файла
- •Формат выходного файла
- •Входные данные
- •Выходные данные
- •Входные данные
- •Выходные данные
- •Рекурсия
- •Комбинаторика
- •2.5. Генерация комбинаторных объектов
- •Множество всех подмножеств
- •Перестановки
- •Размещения
- •Перестановки с повторениями
- •Сочетания с повторениями
- •Перебор
- •Символ o()
- •Отсечение по времени
- •Рассмотрим несколько олимпиадных задач.
- •Шарик в лабиринте
- •Задача 1. Шарик в лабиринте
- •Задача 3 Цепочка слов
- •Входные данные
- •Выходные данные
- •Примеры
- •Формат входного файла
- •Формат выходного файла
- •Примеры
- •Динамическое программирование
- •Задача 8 Гвоздики
- •Задача 13 Лесенки
- •Задача 18 Свинья-копилка
- •Входные данные
- •Выходные данные
- •Задача 13 Лесенки Лесенкой называется набор кубиков, в котором каждый более верхний слой содержит кубиков меньше, чем предыдущий.
- •Задача 18 Свинья-копилка
- •Формат входного файла:
- •Формат выходного файла:
- •Примеры
- •Решение
- •Входные данные:
- •Выходные данные:
- •Формат входа
- •Формат выхода
- •Задача 39 Лесенка-2
- •Входные данные
- •Выходные данные
- •Примеры
- •Системы счисления
- •Задача 11 Троичная сбалансированная система счисления
- •Алгоритм перевода
- •Процедуры и функции для работы с символами и строками
- •Составьте программу, определяющую, является ли введенное слово изображением числа
- •Введите 2 целых числа. Преобразуйте числа в две строки, объедините их в одну строку и выведите результат на экран.
- •Определить количество слов в строке
- •Получите строковой массив из всех слов данной строки
- •Получите строковой массив из всех слов данной строки и
- •Получите строковой массив из всех слов данной строки и
- •Вычислите длину самого короткого и самого длинного слов в строке
- •Подсчитайте количество букв в каждом слове данной строки
- •Дана строка. Определить количество слов этой строки, в которых есть ровно две буквы «е»
- •Составьте программу, удаляющую все лишние пробелы из введенной строки
- •Напишите программу, сортирующую символы введенной с клавиатуры строки в порядке возрастания их номеров в ascii-таблице. Например, если введено: 'cba', в результате надо получить ‘abc’.
- •В тексте, состоящем из маленьких латинских букв , подсчитайте количество гласных букв
- •Заданы фамилия, имя и отчество учащегося, разделенные пробелом. Напечатайте его фамилию и инициалы.
- •Сложное слово состоит из двух частей одинаковой длины и соединительной гласной. Найдите обе части этого слова.
- •Вычеркните из слова х те буквы, которые встречаются в слове z
- •Подсчитайте число различных букв в слове
- •Даны два слова. Составьте программу, определяющую можно или нет из букв слова а составить слово в.
- •Даны два слова. Являются ли они анаграммами
- •Является ли данная строка палиндромом?
- •Задача 4. Сокращение одночленов
- •Входные и выходные данные
- •Это чисто техническая задача на аккуратное программирование.
- •Задача 6 Текст
- •Входной файл Input.Txt в первой строке входного файла находится 5 чисел,разделенных пробелом: n, m, s, t, q.
- •Бинарные деревья. Алгоритм HeapSort
- •Поиск в глубину в графе
- •Алгоритм Флойда поиска кратчайших расстояний и кратчайших путей
- •Бинарные деревья. Алгоритм HeapSort
- •Графызадачи Двоичная куча
- •Примеры задач, которые решаются с помощью двоичной кучи
- •Поиск максимального потока методом Форда-Фалкерсона на Pascal
- •Графызадачи Поиск сильно связанных компонент на Pascal
- •Поиск точек раздела, мостов и двусвязных компонент
- •Идеи алгоритмов
- •Точки раздела
- •Двусвязные компоненты
- •Задача 21 Моя Столица
- •Вычислительная геометрия
- •3. Уравнение прямой 2
- •4. Уравнение прямой проходящей через точку м(х0у0)
- •Формат входного файла
Входные данные
В первой строке входного файла записано число N – длина последовательности (1 N 1000). Во второй строке записана сама последовательность (через пробел). Числа последовательности – целые числа, не превосходящие 10000 по модулю.
Выходные данные
В выходной файл требуется вывести наибольшую длину возрастающей подпоследовательности и саму подпоследовательность.
Пример
Input.txt |
Output.txt |
4 1 4 2 3 |
3 1 2 3 |
Пусть L(i) обозначает максимальную длину последовательности, последним элементом которой является элемент с номером i. Тогда значение L(i+1) может в лучшем случае на 1 больше одного из тех значений L(j), j=1,...i-1, для которых выполняется соотношение А(j)<А(i), т.е. элемент с номером i может продлить подпоследовательность, последним элементом в которой был элемент с номером j. Максимальное значение L(i)i=1,...,N и соответствует решению задачи.
В массиве а будем хранить данную последовательность. В массиве b максимальные длины подпоследовательностей. В массиве с индексы элементоввозрастающих подпоследовательностей.
program naibol_vozvrast_podp_N2;
const nmax=1000;
var a,b,c:array[0..nmax]of longint; { 8) }
i,n,p,j,max,maxi:longint;
log:boolean;
procedure rec(v:longint); рекурсивная процедура вывода
подпоследовательности
begin
if b[v]=0 then exit;
rec (c[v]);
write(a[v],' ');
end;
begin
assign(input,'input.txt');
assign(output,'output.txt');
reset(input);
rewrite(output);
read(n);
fillchar(b,sizeof(n),0);
fillchar(c,sizeof(n),0);
for i:=1 to n do считываем массив
read(a[i]);
for i:=1 to n do массив b заполняем 1
b[i]:=1;
for i:=2 to n do делаем полный перебор, сохраняя лучшие
for j:=1 to i-1 do результаты в массиве b
begin
if a[j]<a[i] если нашли продолжение
последовательности
then
if b[i]<b[j]+1 если новое значение длины
последовательности лучше
then
begin b[i]:=b[j]+1;c[i]:=j; end; запоминаем его;
end;
max:=0;
for i:=1 to n do находим максимальную длину
подпоследовательности и
индекс последнего элемента этой подпоследовательности
if b[i]>max then
begin max:=b[i];maxi:=i;end;
writeln(max); выводим результат
rec (maxi);
close(input);
close(output);
end.
динампрогрзадачи
Задача 10 Деньги
В стране Ы хотят создать свой монетный двор и начать печатать деньги N различных достоинств. Но администрацию интересует вопрос, можно ли набрать с помощью таких купюр заданные суммы без сдачи.
Входные данные:
В первой строке текстового файла записано одно число N — количество купюр. Далее следует N чисел, задающие достоинства купюр. Далее следует число K — количество запросов. Далее следуют запросы, на каждый из которых следует дать ответ. Все числа во входном файле натуральные и не превосходят 103.
Выходные данные:
В выходном файле должно идти K чисел: 0, если соответствующую сумму набрать нельзя, 1 — если можно.
Пример:
Input.txt |
Output.txt |
2 2 4 2 3 2 |
0 1 |
Количество купюр одного достоинства неограничено.
Program many;
const nmax = 1010;
var
n, k,ans : longint;
s : array [0..nmax] of boolean;
begin
assign(input,’input.txt’);
assign(output,’output.txt’);
reset(input);
rewrite(output);
fillchar(s,sizeof(s),0);
s[0]:= true; сумму в 0 рублей набрать можно
read(n); считываем количество купюр
for i:= 1 to n do перебираем купюры
begin
read(x);
for j:= 0 to nmax-x do
if s[j] then s[j+x]:= true; если сумму j набрать можно, то имея купюру x можно набрать и сумму j+x
end;
read(k); считываем количество запросов
for i:= 1 to k do
begin
read(x); считываем сумму которую надо набрать
if s[x] если ее набрать можно
then write('1 ') выводим 1
else write('0 '); иначе 0
end;
close(input); close(output);
end.
динампрогрзадачи
Задача 11 Скобки
Вам необходимо определить количество правильных скобочных последовательностей, состоящих из N пар скобок.
Входные данные:
В единственной строке входного файла одно число N (1 N < 35).
Выходные данные:
Вывести одно число — искомое количество.
Пример:
Input.txt |
Output.txt |
3 |
5 |
Последовательность из 2*N скобок правильная, если для любого значения i (1<=i<=2*N), число открывающихся скобок больше или равно числу закрывающихся скобок и общее число открывающихся скобок в последовательности равно числу закрывающихся. Например: последовательность (()) правильная, а последовательности ()()) и ())(() неправильные.
Тогда надо посчитать кол-во правильных скобочных последовательностей длины N из круглых скобок. Это несложно посчитать динамикой. Обозначим кол-во таких последовательностей длины N за a[N]. Теперь решим данную задачу. Считая, что мы знаем количество таких последовательностей для первых N - 1 значений, найдем a[N].
Рассмотрим первую скобку в последовательности. Если она ( , то рассмотрим все возможные положения соответсвующей ей закрывающей скобки (j-ая позиция). При этом последовательность разбилась на две части: та что внутри этих скобок и та, что справа. Для каждой из этих частей мы уже знаем количество таких последовательностей: a[ j ] и a[N - j -1]. Поэтому можем найти ответ, просуммировав по j все такие произведения.
Program scobki;
const nmax = 1000;
var i, j, n: integer;
a: array[0..nmax] of extended;
Begin
assign(input, 'input.txt');
assign(output, 'output.txt');
reset(input); rewrite(output);
read(n);
a[0] := 1;
a[1] := 1;
for i := 2 to n do
For j := 0 to i - 1 do
a[i] := a[i] + a[j] * a[i - j - 1];
Writeln(a[n]:0:0);
Close(Input); Close(Output);
End.
динампрогрзадачи
Задача 12 Наибольшая последовательнократная подпоследовательность
Для заданной числовой последовательности найдите длину максимальной последовательнократной подпоследовательности в которой каждый элемент делится нацело на все предыдущие. Для последовательнократной подпоследовательности (ai, aj, …, ak) верно, что ai| aj | …| ak, когда I < J < K (выражение a|b эквивалентно b mod a=0).
Входные данные:
В первой строке текстового файла записано одно натуральное число N (N 1000) — количество чисел. Во второй строке N чисел, записанных через пробел. Числа по модулю не превосходят 109.
Выходные данные:
Выведите длину наибольшей последовательнократной подпоследовательности.
Пример:
Input.txt |
Output.txt |
4 3 -6 5 12 |
3
|
динампрогрзадачи
