Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Банк олимпиадных заданий.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
374.86 Кб
Скачать

Формат входных данных

Имя входного файла 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