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

Задача 4 . Вырубка деревьев

Имя входного файла: input.txt

Имя выходного файла: output.txt

Максимальное время работы на одном тесте: 1 секунда

Максимальный объем используемой памяти: 64 мегабайта

Король Флатландии решил вырубить некоторые деревья, растущие перед его дворцом. Деревья перед дворцом короля посажены в ряд, всего там растет N деревьев, расстояния между соседними деревьями одинаковы.

После вырубки перед дворцом должно остаться M деревьев, и расстояния между соседними деревьями должны быть одинаковыми. Помогите королю выяснить, сколько существует способов вырубки деревьев.

Требуется написать программу, которая по заданным числам N и M определит, сколько существует способов вырубки некоторых из N деревьев так, чтобы после вырубки осталось M деревьев и соседние деревья находились на равном расстоянии друг от друга.

 

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

Входной файл INPUT.TXT содержит два целых числа M и N (0 <= M <= N <= 1000).

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

В выходном файле OUTPUT.TXT должно содержаться одно число - искомое количество способов.

Пример входных и выходных данных

input.txt

output.txt

5 3

 

4

Краткие методические рекомендации по решению задачи

Зафиксируем расстояние между деревьями после вырубки. Если оно равно d, то возможно  n – d(m – 1) – m + 1 способов вырубить деревья. Суммируя по всем d, получаем ответ.

Если у нас есть  0 деревьев и 0 деревьев должно остаться после вырубки, то существует один вариант вырубки - это надо учитывать при решении задачи.

Вариант 1 (с использованием цикла)

var

n, m : longint;

i, d, s : longint;

input, output: text;

begin

Assign(input,'input.txt');

Reset(input);

Assign(output,'output.txt');

Rewrite(output);

Read(input,n,m);

s := 0;

if m = 0 then

s := 1

else

if m = 1 then

s := n

else

for d := 1 to (n-1) div (m-1) do

inc(s,n-(m-1)*d);

Write(output,s);

Close(input);

Close(output);

end.

 

Вариант 2 (без цикла)

var

n, m ,k: longint;

i, d, s : longint;

input, output: text;

begin

Assign(input,'input.txt');

Reset(input);

Assign(output,'output.txt');

Rewrite(output);

read(input,n,m);

if m=0 then

s:=1

else

if m=1 then

s:=n

else

begin

k:=(n-1) div (m-1);{количество членов прогрессии}

d:=m-1;{шаг прогрессии}

s:=(2+(k-1)*d)*k div 2;{формула суммы первых членов арифметической прогрессии}

end;

write(output, s);

Close(input);

Close(output);

end.

Тема: Сортировка и поиск.

Задача 1. Почтовые отделения.

Вдоль прямой дороги расположены деревни. Дорога представляется целочисленной осью, а расположение каждой деревни задается одним целым числом – координатой на этой оси. Никакие две деревни не имеют одинаковых координат. Расстояние между двумя деревнями вычисляется как модуль разности их координат.

В некоторых, не обязательно во всех, деревнях будут построены почтовые отделения. Деревня и расположенное в ней почтовое отделение имеют одинаковые координаты. Почтовые отделения необходимо расположить в деревнях таким образом, чтобы общая сумма расстояний от каждой деревни до ближайшего к ней почтового отделения была минимальной.

Задание

Напишите программу, которая по заданным координатам деревень и количеству почтовых отделений находит такое расположение почтовых отделений по деревням, при котором общая сумма расстояний от каждой деревни до её ближайшего почтового отделения будет минимальной.

Входные данные

Первая строка входного файла POST.DAT содержит два целых числа: первое число – количество деревень V, 1≤V≤300, второе число – количество почтовых отделений P, 1≤P≤30, PV. Вторая строка содержит V целых чисел в возрастающем порядке, являющихся координатами деревень. Для каждой координаты X выполняется 1≤X≤10000.

Выходные данные

Первая строка выходного файла POST.SOL содержит одно целое число S – общую сумму расстояний от каждой деревни до её ближайшего почтового отделения для расположения почтовых отделений, описанного во второй строке. Вторая строка содержит P целых чисел в возрастающем порядке. Эти числа являются искомыми координатами почтовых отделений. Если для заданного расположения деревень есть несколько решений, то программа должна найти одно из них.

Пример входных и выходных данных

POST.DAT

POST.SOL

10 5

1 2 3 6 7 9 11 22 44 50

9

2 7 22 44 50