- •Оценка эффективности алгоритмов
- •Целочисленная арифметика
- •Дано натуральное число. Выяснить является ли оно палиндромом, то есть читается справа налево и слева направо одинаково
- •Дано натуральное число. Выяснить соотношение между количествами двоек и пятерок в этом числе
- •Найти самую большую и самую маленькую цифры данного натурального числа
- •Выяснить образуют ли цифры натурального числа возрастающую последовательность
- •Формат выходного файла
- •Формат входного файла
- •Формат выходного файла
- •Формат входного файла
- •Формат входного файла
- •Формат выходного файла
- •Длинная арифметика
- •Выходные данные
- •Задачи Задача 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)
- •Формат входного файла
Вычислительная геометрия
“Вычислительная геометрия” это раздел олимпиадных задач, который считается одним из наиболее сложных. Сложность решения задач на вычислительную геометрию состоит в том, что необходимо обладать знаниями не только за курс средней школы, но и знать основы аналитической геометрии и высшей алгебры. Объем этих знаний достаточно велик, программы получаются большими и сложными для отладки. Необходимо знать и помнить как пишутся процедуры и функции реализующие классические задачи по вычислительной геометрии. И еще одна сложность- большинство вычислений ведутся с вещественными числами с заданной точностью и обычные геометрические понятия приобретают необычные черты. Например если точность вычислений eps=10-3., то точка считается принадлежащей прямой, если она находится в полосе шириной 2*eps.
то
есть, если расстояние
от
точки до прямой <=eps,
то точка считается
принадлежащей прямой
То же самое для двух вещественных чисел на числовой прямой. Числа a и b считаются равными если расстояние между ними не превышает eps, то есть abs(a-b)<=eps. Число a больше числа b если a-b>eps.
Для сравнения вещественных чисел можно написать и использовать логические функции, а можно сравнивать их напрямую в тексте программы.
Координаты точек можно хранить в виде двух переменных x и y, уравнение прямой в виде трех чисел a,b,c или использовать свои типы Tpoint и Tline.
Структуры данных:
Const eps: real=0.5e-6; точность вычислений
Type Tpoint=record x,y:real; end; тип –точка с координатами x,y
Type Tline=record A,B,C:real; end; тип - прямая
Реализация операций сравнений:=,<,>,<=,>= имеет вид:
Begin
RealEq:=abs(a-b)<=eps;
End;
Function RealMore(a,b:real):boolean; строго больше
Begin
RealMore:=a-b>eps;
End;
Function RealLess(a,b:real):boolean; строго меньше
Begin
RealLess:=b-a>eps;
End;
Function RealMoreEq(a,b:real):boolean; больше или равно
Begin
RealMoreEq:=a-b>-eps;
End;
Function RealLessEq(a,b:real):boolean; меньше или равно
Begin
RealLessEq:=a-b>-eps;
End;
Function RealMax(a,b:real):real; максимальное из двух
вещественных чисел
Begin
If RealMore(a,b) then RealMax:=a else RealMax:=b;
End;
Function RealMin(a,b:real):real; минимальное из двух
вещественных чисел
Begin
If RealMore(a,b) then RealMin:=b else RealMin:=a;
End;
Функции реализующие элементарные задачи вычислительной геометрии:
Function EqPoint(A,B:Tpoint):boolean; функция совпадение двух точек.
Begin точки совпадают, если их
координаты совпадают
EqPoint:=RealEq(A.x,B.x)and RealEq(A.y,B.y)
End;
Function GetAngle(x,y:real):real; Определяет угол между
направлением на точку (x,y) и
положительным направлением
оси OX.
Var rs,c:real; Величина угла в
промежутке от (– до ].
Begin
If Abs(X) > eps
Then
If (X < 0)and(Y<0) A(x,y)
Then GetAngle :=ArcTan(Y
/ X) – Pi
Else
If (X < 0)and(Y>=0)
Then GetAngle :=ArcTan(Y / X) + Pi
Else GetAngle :=ArcTan(Y / X)
Else
If Y > 0
Then GetAngle :=Pi / 2
Else GetAngle :=-Pi / 2;
End;
function Rast2Point(x1,y1,x2,y2:real):real; расстояние между двумя точками
begin
Rast2Point:=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
function acos:real нахождение арккосинуса угла по значению
косинуса
begin
if RealEq(cosa,0)
then acos:=pi/2
else if cosa<-eps
then acos:=pi+arctan(1/sqr(cosa)-1)
else acos:=arctan(1/sqr(cosa)-1);
end;
Procedure Point2ToLine(A,B:Tpoint;var L:Tline); определение уравнения
прямой по координатам
двух точек
Begin
L.A:=B.y-A.y;
L.B:=A.x-B.x;
L.C:=-(A.x*L.a+A.y*L.b);
End;
Необходимый минимум теоретических знаний для успешного решения задач по вычислительной геометрии:
Логические функции сравнения вещественных чисел.
Площадь ориентированного треугольника, произвольного многоугольника.
Сортировка вершин произвольного многоугольника по полярному углу.
Уравнение прямой проходящей через две точки
общего вида ax+by+c=0
каноническое (x-x1)/(x2-x1)=(y-y1)/(y2-y1)
параметрическое x:=x1+t(x2-x1);
y:=y1+t(y2-y1);
Уравнение прямой перпендикулярной данной ax+by+c=0 и проходящей через данную точку (x0,y0).
Принадлежность точки отрезку
Взаимное расположение двух отрезков (все случаи).
Нахождение точки пересечения отрезка и прямой или выяснения того факта, что они не пересекаются.
Нахождение уравнения касательной к окружности (x-x0)2+(y-y0)2=r2 , проходящей через данную точку (x0,y0).
Является ли точка (x0,y0) внутренней для данного произвольного многоугольника.
Формула деления отрезка в данном отношении.
Расстояние от точки до прямой.
Расстояние от точки до отрезка.
Расстояние между двумя параллельными прямыми.
Выяснить, какие стороны выпуклого многоугольника видны из данной точки.
Дано множество точек. Найти его выпуклую оболочку.
Некоторые сведения из аналитической геометрии.
Измерение величин углов
Величины углов измеряются в градусах и радианах.
Опр. Один градус это 1/360 часть полного угла.
Опр. Один радиан это величина центрального угла, опирающегося на дугу, длина которой
р
авна
радиусу окружности.
1 рад= величине угла AOB
Если взять угол в n раз больше
то и длина дуги будет в n раз
A больше ,т.е. мы имеем прямо-
пропорциональную зависимость между величиной
центрального угла и длиной дуги на которую он опирается.
1 рад - R
360- 2R
Отсюда 1 рад=180/ и 1= /180
При решении задач вычислительной геометрии градусы всегда переводятся в радианы.
Векторы.
Опр. Вектор – это направленный отрезок или параллельный перенос.
Вектор определяется длиной и направлением.
Для того чтобы найти координаты вектора по координатам начала и конца надо из координат конца вычесть координаты начала.
А(x1,y1)
B(x2,y2)
AB(x2-x1,y2-y1).
Длина вектора AB=SQRT((x2-x1)* (x2-x1)+(y2-y1)* (y2-y1)).
Опр. Векторы называются коллинеарными, если они лежат на одной прямой или на параллельных прямых.
Условие коллинеарности векторов:
Векторы коллинеарны тогда и только тогда когда их координаты пропорциональны.
a(x1,y1)
коллинеарен b(x2,y2)
x1/x2=y1/y2.
Скалярное произведение векторов
Скалярное произведение векторов через длины векторов
(ab)=a*b*cos(@)
Скалярное произведение векторов через координаты векторов
Если a(x1,y1), b(x2,y2) то (ab)=x1*x2+y1*y2.
Условие перпендикулярности векторов.
Векторы перпендикулярны тогда и только тогда когда их скалярное произведение равно нулю.
Векторное произведение векторов
Опр.Векторное произведение векторов a и b это вектор c удовлетворяющий трем условиям:
1) он перпендикулярен плоскости, в которой лежат вектора a и b.
2) его длина численно равна площади параллелограмма, построенного на
векторах a и b.
Он образует с векторами a и b правую тройку векторов, т.е. если смотреть с конца вектора с, то поворот от a к b будет против часовой стрелки.
Обозначается векторное произведение [ab] или aхb. Модуль вектора c равен absin и численно совпадает с площадью параллелограмма, построенного на этих векторах.
Векторное произведение в координатах в пространстве.
Пусть a(x1,y1,z1), b(x2,y2,z2), тогда
[ab]=(y1*z2-y2*z1)*i+(x2*z1-x1*z2)*j+(x1*y2-x2*y1)*k.
Где i,j,k координатные единичные векторы или орты.
На плоскости [ab]=(x1*y2-x2*y1)*k. (1)
Найдем площадь треугольника, используя векторное произведение.
Пусть дан треугольник ABC. Координаты его вершин A(x1,y1),B(x2,y2), C(x3,y3). Рассмотрим векторы AB(x2-x1,y2-y1) и AC(x3-x1,y3-y1).
По формуле (1) [AB AC]=(( x2-x1)*( y3-y1)- ( x3-x1)*( y2-y1))*k.
Если обозначить координаты векторов АВ (a1,b1) и АС(a2,b2), то векторное произведение на плоскости запишется в виде
[AB AC]=a1*b2-b1*a2. Его вычисление можно оформить в виде функции.
Function VectMul(a1, b1, a2, b2: Longint): Longint;
Begin
VectMul := a1 * b2 - a2 * b1;
End;
Число 0.5*( x2-x1)*( y3-y1)- ( x3-x1)*( y2-y1) имеет положительный знак, если обход треугольника ABC происходит против часовой стрелки, и отрицательный знак, если по часовой, и модуль его равен площади треугольника ABC.
Говорят , что число 0.5*( x2-x1)*( y3-y1)- ( x3-x1)*( y2-y1) есть площадь ориентированного треугольника. Формулу можно записать в другом виде:
S=0.5*(x1*(y2-y3)+x2*(y3-y1)+x3*(y1-y2))
Рассмотрим основные элементарные задачи вычислительной геометрии.
Общее уравнение прямой
Уравнение прямой, проходящей через две точки A(x1,y1) и B(x2,y2)
Найти уравнение прямой, зная координаты точки на прямой и координаты вектора , перпендикулярного этой прямой
Уравнение прямой проходящей через точку М(х0у0) перпендикулярной прямой ax+by+c=0
Уравнение прямой проходящей через точку M(x0,y0) параллельно вектору t(m,n)
Параметрическое уравнение прямой
Полярный угол точки
Угол между векторами
Площадь треугольника
Найти уравнение прямой, параллельной данной и отстоящей от нее на заданное расстояние
Принадлежность точки отрезку
Принадлежность точки прямой
Принадлежность точки лучу
Положение двух точек и прямой
Расстояние от точки до прямой
Расстояние от точки до луча
Расстояние от точки до отрезка
Замки
Пересечение двух отрезков
Пересечение двух прямых
Биссектриса угла
Касательная к окружности
Окружность и прямая
Две окружности
Длина дуги
Параллельный перенос на вектор AB
Поворот вокруг точки на угол
Центральная симметрия
Осевая симметрия относительно прямой ax+by+c=0
Гомотетия
Симметричная точка
Неизвестная вершина квадрата
Треугольник симметричный относительно точки
Треугольник симметричный относительно прямой
Калейдоскоп
Заполнение экрана
Восстановление координат вершин треугольника
Задание множества точек на плоскости неравенствами
Множество точек
Продолжение отрезка
Куда идем мы с Пятачком?
Ломаная линия
Проверка принадлежности точки многоугольнику
Проверка принадлежности точки выпуклому многоугольнику
Проверка принадлежности точки произвольному многоугольнику
Прямая и окружность
Соединение точек простой замкнутой ломаной
Нахождение длины общей касательной для двух окружностей
Тропинка
Повороты
Точка и треугольник
Выпуклость многоугольника
Площадь произвольного многоугольника
Деление отрезка в данном отношении
Разделить площадь данного треугольника АВС в отношении равном k
Окружность и треугольник
Коза на привязи
Анамейтронная звезда
Кролик и бобер
Остров
Целые точки
Правильный многоугольник
Кратчайшее расстояние 1
Кратчайшее расстояние 2
Нахождение точки Штейнера аналитическим методом
Станция
Нахождение точки Штейнера методом скорейшего спуска
Теорема Альхазена
Сад
Лента из трапеций
Голова на плечах
Метеоритный дождь
Окружности
Индейские бои
Фонарики
1. Общее уравнение прямой
Общее уравнение прямой имеет вид a*x+b*y+c=0, где a,b – координаты вектора перпендикулярного прямой.
n(a,b)
2. Уравнение прямой, проходящей через две точки A(x1,y1) и B(x2,y2)
Возьмем на прямой произвольную точку С
В(х2,у2)
С(х,у)
А(х1,у1)
Находим координаты векторов
АС(х-х1,у-у1);
АВ(x2-x1,y2-y1);
Т
ак
как AC
AB,
то их координаты пропорциональны
(x-x1)/(x2-x1)=(y-y1)/(y2-y1); т.е. (x-x1)*(y2-y1)=(y-y1)*(x2-x1);
(y2-y1)*x+(x1-x2)*y +x1*y2-y1*x2 =0
Следовательно ax+by+c=0 искомое уравнение прямой и
a=y2-y1
b=x1-x2
c=x1*y2-y1*x2
Входные данные:
Четыре целых числа — координаты двух различных точек .
Выходные данные:
Три целых числа — коэффициенты А, В и С общего уравнения этой прямой.
Пример
Input.txt |
Output.txt |
12 3 1 |
-1 -2 5 |
Program urprjmoi;
Var X1, Y1, X2, Y2,A,B,C: Longint;
Begin
assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);
Read(X1, Y1, X2, Y2);
A:= Y2 - Y1;
B:= X1 - X2;
C:= Y1*X2 - X1*Y2;
Write(A, ' ', B, ' ', C);
Close(Input);
Close(Output);
End.
