- •Тема: Перебор вариантов. Задача 1. Замечательные числа
- •Задача 2. Острова
- •Задача 3 Клавиатура
- •Задача 4 . Вырубка деревьев
- •Краткие методические рекомендации по решению задачи
- •Оценка решения
- •Формат входных данных
- •Формат выходных данных
- •Работа с большими числами
- •Золото племени абба
- •Сортировка и поиск
- •2. Домашнее задание.
- •Метод перебора вариантов, отсечения перебора
- •Сумма двух чисел
- •Элементы вычислительной геометрии
- •4. Две окружности
- •Эффективные структуры данных
- •5. Поиск прямоугольников (Время: 0,5 сек. Память: 16 Мб Сложность: 34%)
- •Тема 1: «Работа с длинными числами»
- •Тема 2: Алгоритмы поиска и сортировки
- •Тема 3: Аналитическая геометрия
- •Тема 4: Перебор вариантов
- •Тема 5: Строки. Элементы лексического и синтаксического разобра
- •Задача 3. "Функция"
- •Ограничения
- •Площади покрытия антенны
- •Площадь покрытия решение
- •Элементы лексического и синтаксического разбора Шифровка
- •Шифровка Решение
- •Сортировка и поиск Независимые судьи
- •Независимые судьи Решение
- •Сувениры
- •Сувениры Решение
- •Треугольник Условие задачи
- •Треугольник Решение
- •Олимпиадные задачи по информатике
- •Задача 1. «Код да Винчи»
- •Задача 3 «Буквы»
- •Задача 4 «Соревнования»
- •Задача «Красивая последовательность»
- •Тема: Задача на динамическое программирование
- •Динамическое программирование Задача: Черепашка
- •Решение
- •Тема: Работа с большими числами
- •Тема: Сортировка и выбор
- •Задача. Подземная дорога (поиск в ширину)
- •Формат входных данных
- •Задача rebus
- •Задача “Эчпочмаки”
- •Задача “Ниточка”
- •Задача “Обезьяны”
- •Задача Интересное число
Формат входных данных
Имя входного файла input.txt
В файле INPUT.TXT записано два числа N и M (0 < N<= 100, 0 <= M <= N*(N-1)/2). В следующих M строках записаны по два числа i и j (1<= i,j<= N), которые означают, что перекрестки i и j соединены тоннелем.
Формат выходных данных
Имя выходного файла output.txt
В файл OUTPUT.TXT вывести N чисел: k-ое число означает количество светофоров на k-ом перекрестке.
Примечание: Можно считать, что любые два перекрестка соединены не более, чем одним тоннелем. Нет тоннелей от перекрестка i до него самого.
Пример
input.txt |
output.txt |
7 10 |
3 3 2 2 5 2 3 |
5 1 |
|
3 2 |
|
7 1 |
|
5 2 |
|
7 4 6 5 6 4 7 5 2 1 5 3 |
|
Решение
Program Svetofor;
var n, i, j, k : longint;
a : array [1..100] of integer;
b : array [1..5000, 1..2] of integer;
num : char;
t : integer;
f : text;
procedure swap (var a, b : integer); {замена}
var t : integer;
begin
t := a;
a := b;
b := t;
end;
begin
for num := '1' to '9' do begin
randomize; {случайным образом формируем матрицу}
writeln('Test #', num, ', n = ');
readln(n);
fillchar(a, sizeof(a), 0);
k := 0;
for i := 1 to n do
for j := 1 to i - 1 do
if random(MaxInt) >MaxInt div 2 then begin
inc(a[i]);
inc(a[j]);
inc(k);
b[k, 1] := i;
b[k, 2] := j;
end;
for i := 1 to k do begin
j := random(k)+1;
t := random(k)+1;
swap(b[t, 1], b[j, 1]);
swap(b[t, 2], b[j, 2]);
end;
assign(f, 'y_' + num + 'input.txt');
rewrite(f);
writeln(f, n, ' ', k);
for i := 1 to k do
writeln(f, b[i, 1], ' ', b[i, 2]);
close(f);
assign(f, 'y_' + num + 'output.txt');
rewrite(f);
for i := 1 to n do
write(f, a[i], ' ');
writeln(f);
close(f);
end;
end.
Тема: Метод перебора вариантов.
Задача 3: Зернышки
Имя входного файла: Input.txt.
Имя выходного файла: Output.txt.
В банке находятся белые и черные зернышки. Каждый раз из банки вынимают наугад два зернышка. Если они одинакового цвета, то их выбрасывают, а в банку кладут черное зернышко (черных зернышек достаточное количество). Если же зернышки разного цвета, то черное зернышко выбрасывают, а белое возвращают в банку. Эти действия повторяют, пока не останется одно зернышко.
Задание. Напишите программу, которая по известному количеству черных и белых зернышек определяет цвет последнего зернышка.
Входные данные. В единственной строке записаны два числа – количество белых и черных зернышек.
Выходные данные. Единственная строка выходного текстового файла должна содержать цвет оставшегося зернышка: white – если зернышко белое, black – если зернышко черное.
Пример входных и выходных данных:
-
Input.txt
Output.txt
4 3
black
program grain;
var white, black:longint;
begin
assign(input, 'input.txt');
reset(input);
assign(output, 'output.txt');
rewrite(output);
read(white, black);
if odd(white) then writeln('white') else {проверка чётности числа}
writeln('black');
close(input);
close(output);
end.
Тема: Работа с большими числами.
Задача 4: Простые гири
Существуют гири массой 1 г, 2г, …, N г (N ≤ 500000). Напишите программу, которая распределяет эти гири на максимально возможное количество пар, так чтобы общий вес гирь в каждой паре выражался простым числом.
Формат входящих данных: входной файл Input.txt содержит одно число N.
Формат выходящих данных: в выходной файл Output.txt выведите список найденных пар, по одной паре в ряду.
Решение
P
rogram
Prost_g;
var N:LongInt;
Procedure Read_data; {Процедура чтения начальных данных }
begin
assign(Input, 'Input.txt');
reset(Input);
readln(N);
close(Input)
end;
Function Prost(x:LongInt): Boolean; {Функция определения, является ли число простым}
var
q:Boolean;
i:LongInt;
begin
q:=False;
if Odd(x) then
begin
q:=True;
i:=3;
while (i*i<=x) and q do
if x mod i=0 then q:=False
else inc(i,2)
end;
Prost :=q
end; {End Prost}
Procedure Solve_Write; {Процедура поиска и записи «простых» пap}
var
flag:Boolean;
i, j : LongInt;
begin
assign(Output, 'Output.txt');
rewrite(Output);
repeat
i:=l;
while not Prost(n+i) do inc(i);
j:=i-l;
while i<n do
begin
writeln(i, ‘ ‘ ,n);
inc(i);
dec(n)
end;
n:=j
until n<=l;
close(Output)
end; {End Solve_Write}
BEGIN
Read_Data;
Solve_Write;
END.
Тема: Метод перебора вариантов.
Задача 5: Покупка билетов
Имя входного файла: Input.txt.
Имя выходного файла: Output.txt.
Максимальное время работы на одном тесте: 5 секунд.
Максимальный объем использованной памяти: 4 Мбайты.
За билетами на премьеру нового мюзикла собралась очередь из N лиц, каждое из которых хочет купить 1 билет. На всю очередь работала только одна касса, потому продажа билетов продвигалась очень медленно, от чего «клиенты» очереди впадали в отчаяние. Самые сообразительные быстро приметили, что, как правило, несколько билетов в одни руки кассир продает быстрее, чем когда эти же билеты продаются по одному. Поэтому они предложили нескольким людям, которые стоят рядом, отдавать деньги первому из них, чтобы он купил билеты на всех.
Но для борьбы со спекулянтами кассир продавала не больше 3-х билетов в одни руки, потому договориться таким образом между собой могли лишь 2 или 3 лица, которые стоят рядом.
Известно, что на продажу і лицу из очереди одного билета кассир тратит Аі секунд, на продажу двух билетов – Ві секунд, трёх билетов – Сi секунд.
Задание. Напишите программу, которая определит минимальное время, за которое можно было бы обслужить всех покупателей.
Обратите внимание, что билеты на группу людей, которые объединились, всегда покупает первый из них. Также никто с целью ускорения не покупает лишние билеты (то есть билеты, которые никому не нужные).
Входные данные. Первая строка входного файла содержит единственное число N – количество покупателей в очереди (1N5000). В каждой из следующих N строк записана тройка натуральных чисел Аі, Bi, Сi. Каждое из этих чисел не превышает 3600. Люди в очереди нумеруются, начиная от кассы
Выходные данные. Исходный файл содержит одно число – минимальное время в секундах, за которое можно было бы обслужить всех покупателей.
Пример входных и выходных данных
-
Input.txt
Output.txt
5
12
5 10 15
2 10 15
5 5 5
20 20 1
20 1 1
2
4
3 4 5
1 1 1
Решение
program buying_tickets;
const size=5000;
var
a, b, c: array [1..size] of integer;
time: array [1..size of longint;
n:integer;
procedure read_data; {процедура считающая количество людей в очереди}
var i:integer;
begin
assign(input, 'input.txt');
reset(input);
readln(n);
for i:=1 to n do readln(a[i], b[i], c[i]);
close(input);
end;
function min(x,y:longint:longint);
begin
if x<y then min:=x else min:=y;
end;
procedure solv; {процедура подсчитывает время продажи билетов}
var i:integer;
begin
time[1]:=a[1];
time[2]:=min(a[1]+a[2], b[1]);
time[3]:=min(time[2]+a[3], min(a[1]+b[2], c[1]));
for i:=4 to n do
time[i]:=min(time[i-1]+a[i], min(time[i-2]+b[i-1],
time[i-3]+c[i-2]));
end;
procedure write_data; {запись результатов в файл}
begin
assign(output, 'output.txt');
rewrite(output);
writeln(time(n));
close(output);
end;
begin
read_data;
solve;
write_data;
end.
Оглавление
Задача 4 . Вырубка деревьев 5
Входные данные 7
Пример входных и выходных данных 7
Работа с большими числами 15
Сортировка и поиск 17
Метод перебора вариантов, отсечения перебора 19
Элементы вычислительной геометрии 21
Эффективные структуры данных 23
Формат входных данных 43
Формат выходных данных 43
Задача 3. "Функция" 50
Тема: Сортировка и поиск 52
Задача “Шифровка” 52
Ограничения 56
Задача. Подземная дорога (поиск в ширину) 98
Формат входных данных 98
