- •Оценка эффективности алгоритмов
- •Целочисленная арифметика
- •Дано натуральное число. Выяснить является ли оно палиндромом, то есть читается справа налево и слева направо одинаково
- •Дано натуральное число. Выяснить соотношение между количествами двоек и пятерок в этом числе
- •Найти самую большую и самую маленькую цифры данного натурального числа
- •Выяснить образуют ли цифры натурального числа возрастающую последовательность
- •Формат выходного файла
- •Формат входного файла
- •Формат выходного файла
- •Формат входного файла
- •Формат входного файла
- •Формат выходного файла
- •Длинная арифметика
- •Выходные данные
- •Задачи Задача 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, затем число M, задающие размеры лабиринта (1N10, 1M10). Далее идет N строк, по M чисел в каждой, задающих лабиринт. Каждое из этих чисел 0 или 1 — 0 означает пустой куб, а 1 — гранитный.
Выходные данные
В выходной файл выведите одно число — минимальное возможное количество разрезов, которое нужно сделать в рулоне, чтобы застелить все пустые клетки лабиринта.
Примеры
Input.txt |
Output.txt |
1 10 1 0 0 0 0 0 0 0 0 1 |
0 |
2 5 0 0 0 0 0 0 1 1 1 0 |
2 |
Решается методом перебора с возвратом.
{$A+,B-,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V+,X+,Y+}
{$M 65520,0,655360}
const maxn=10;maxm=10;
l:array[1..11] of integer=(1,2,4,8,16,32,64,128,256,512,1024);
var
a:array[0..maxn,0..maxm] of integer; карта лабиринта
b:array[1..maxn+1,-1..1024] of boolean;
c:array[1..maxn] of integer;
ans,now:array[1..maxn] of integer;
n,m:integer;
res,nowres:longint;
time:longint absolute $0:$46c;
oldtime:longint;
procedure out; forward;
procedure init;
var i,j:integer;
begin
oldtime:=time;
assign(input,'input.txt');
reset(input);
read(n,m);
for i:=1 to n do
for j:=1 to m do
begin
read(a[i,j]);
c[i]:=(c[i] shl 1)+a[i,j];
end;
close(input);
end;
procedure rec(p:integer;q1,q2:integer); рекурсивная процедура поиска решения
var i,j:integer;
f:boolean;
pr:longint;
begin
if (time-oldtime)/8.2>7.9 then exit; отсечение по времени
if nowres>=res then exit; если текущий результат хуже
найденного ранее, то возвращаемся
if p=n+1 then если все просмотрели то
возвращаемся
begin
if nowres<res then если получили лучший результат
begin res:=nowres;ans:=now;end; то запоминаем его
exit;
end;
inc(p); переходим к рассмотрению
следующего варианта
if b[p,-1] then rec(p,0,0) else
for i:=0 to l[m+1]-1 do
if (b[p,i])or(b[p,-1]) then
begin
f:=true;
for j:=0 to m-1 do
if ((i and (1 shl j))=0)and((q1 and (1 shl j))<>0)and
((q2 and(1 shl j))=0)and(not b[p-1,-1])and(a[p-1,j+1]<>1) then
f:=false;
if f then begin
pr:=0;
for j:=0 to m-1 do
if (i and (1 shl j))<>(i and (1 shl (j+1))) then
if (i and(1 shl j)=0)then inc(pr);
if i and (l[m])=0 then inc(pr);
for j:=0 to m-1 do
if (((q1 and (1 shl j))=0) and ((i and (1 shl j))<>0))and(a[p,j+1]<>1)
then inc(pr);
for j:=0 to m-1 do
if (a[p-1,j+1]=1)and(i and(1 shl j)<>0)and(a[p,j+1]<>1) then inc(pr);
now[p]:=i;
inc(nowres,pr);
rec(p,i,q1);
dec(nowres,pr);
end;
end;
end;
procedure solve;
var i,j,k:integer;
begin
res:=maxlongint;
fillchar(b,sizeof(b),true);
for i:=1 to n do
begin
for j:=0 to l[m+1]-1 do
begin
if ((j>=l[m-1])and(j<l[m]))or(((j and (1 shl 0))=0)and(j and (1 shl 1)<>0)) then b[i,j]:=false else
for k:=1 to m do
if (j and (a[i,k] shl (k-1))=0)and(a[i,k]=1) then b[i,j]:=false;
if b[i,j] then
for k:=1 to m-2 do
if (j and(1 shl (k-1))=0)and(j and(1 shl (k))<>0)and(j and(1 shl (k+1))=0) then
b[i,j]:=false;
end;
end;
for i:=1 to n do
if c[i]=l[n+1]-1 then b[i,-1]:=true else b[i,-1]:=false;
rec(0,0,0);
end;
procedure out;
begin
assign(output,'output.txt');
rewrite(output);
write(res-1);
close(output);
end;
begin init; solve; out; end.
переборзадачи
Задача 7 Значение выражения
Дано натуральное число m. Вставить между некоторыми цифрами 1,2,3,4,5,6,7,8,9 знаки + - так, чтобы значение получившегося выражения равнялось m.Если знаки расставить невозможно, вывести ‘no’.
program pastznak;
var t:array[2..9] of string; массив запомненных знаков
m,i:integer; m-заданное число
procedure sign(s,r:longint;op:char;n:integer);
var newr:longint; newr-текущая сумма
begin s-следующее слагаемое
r-текущая сумма
op -текущий знак
n-текущая цифра
if op='+' then newr:=r+s else newr:=r-s;
if n<=9 then
begin
t[n]:='+'; sign(n,newr,'+',n+1);
t[n]:='-'; sign(n,newr,'-',n+1);
t[n]:=''; sign(s*10+n,r,op,n+1);
end
else {проверка равенства}
if newr=m then
begin
for i:=2 to 9 do write(i-1,t[i]); вывод результата
writeln('9');
end;
end;
begin
assign(input,'input.txt');
reset(input);
assign(output,'output.txt');
rewrite(output);
read(m);
sign(1,0,'+',2);
close(input); close(output);
end.
переборзадачи
Задача 8 Последовательность
Последовательность 1001011001101001... строится так: сначала пишется 1, затем повторяется такое действие: уже написанную часть приписывают справа с заменой элемента 0 на 1 и наоборот, т.е. 1->10->1001->10010110->...
Требуется написать программу, вычисляющую n-ый член этой последовательности по заданному n<=2147483647.
Формат входных данных:
Входной файл Input.txt содержит натуральное число n.
Формат выходных данных:
В выходной файл Output.txt вывести найденную цифру.
Пример
Input.txt |
Output.txt |
6 |
1
|
Решение: Пусть на искомом месте стоит 0. Определим, откуда и из чего получилось это значение при указанных в условии задачи построениях. Это продолжаем до тех пор, пока не возвратимся к началу построения (вначале пишется 1). Если найденное нами значение совпадает с 1, значит на искомом месте действительно стоит 0, а иначе там 1.
var
n, p : longint;
t : byte;
begin
assign(input,'input.txt'); reset(input);
assign(output,'output.txt'); rewrite(output);
read(n);
if n>1073741824
then p:=1073741824
else
if n>536870912
then p:= 536870912
else
begin p:=1; while p<n do p:=p*2; p:=p div 2 end;
t:=0;
while n>1 do
begin
t:=1-t;
n:=n-p;
while p>=n do p:=p div 2
end;
write(1-t); close(output)
end.
переборзадачи
Задача 9 Конструктор
Недавно Пете подарили конструктор. В конструкторе N деталей. Детали пронумерованы от 1 до N. На каждой детали находятся разъемы; каждый разъем помечен латинской заглавной буквой. Все разъемы одной детали помечены разными буквами. Два разъема на разных деталях могут быть соединены, если они помечены одинаковыми буквами.
Пете надоело собирать детали в соответствии с инструкцией. Он решил выбрать K деталей конструктора и собрать из них свою конструкцию так, чтобы она удовлетворяла следующим требованиям:
Все разъемы каждой использованной детали были соединены с разъемами других деталей.
Число K должно быть максимально возможным.
Помогите Пете выбрать подходящие детали для сборки своей конструкции.
