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

Оценка решения

Если выходной файл не соответствует описанным требованиям – оценка 0. В противном случае, оценка будет вычислена по таблице 1 следующим образом: если найденная сумма – S, а минимальная сумма – Smin, то необходимо вычислить q=S/Smin и найти соответствующую оценку c в нижней строке.

q=S/Smin

q=1.0

1.0<q≤1.1

1.1<q≤1.15

1.15<q≤1.2

1.2<q≤1.25

1.25<q≤1.3

1.3<q

c

10

5

4

3

2

1

0

Решение

Program POST;

const MaxN = 350;

var k, n, p: integer;

x: array [1..MaxN] of integer;

d, t: array [1..MaxN] of longint;

pr: array [1..MaxN, 1..35] of integer; {объявление массивов}

procedure ReadAll;{процедура связи с файлом вход. данных и записи в файл}

var i: integer;

begin

Assign(input, 'post.dat'); Reset(input);

Assign(output, 'post.sol'); Rewrite(output);

Read(n, p);

for i := 1 to n do read(x[i]); {цикл перебора элементов массива}

end;

procedure Solve; {основная процедура решения задачи}

var i, j, r, m: integer;

min, s: longint;

begin

fillchar(d, sizeof(d), 0); {заполняем строку нулями}

for i := 1 to n do begin

s := 0;

for j := 1 to i-1 do inc(s, longint(x[i])-longint(x[j]));{увеличиваем значение переменной s и преобразовываем элементы массива в длинное целое}

d[i] := s;

end;

for k := 2 to p do begin

for i := 1 to N do begin

t[i] := 1000000000;

r := i; {запись координат деревень }

s := 0;

for j := i-1 downto 1 do

begin

while (r > j) and (x[i]-x[r-1] < x[r-1]-x[j]) do begin {координаты почты }

dec(r);

s := s - (longint(x[r]) - longint(x[j+1])) +

(longint(x[i]) - longint(x[r]));

end;

inc(s, longint(r-j-1) * (longint(x[j+1])-longint(x[j])));

if s + d[j] < t[i] then begin

t[i] := s + d[j];

pr[i, k] := j;

end;

end;

end;

d := t;

end;

min := maxlongint;

for i := 1 to n do begin {вычисление минимального расстояния}

s := d[i];

for j := i+1 to n do inc(s, longint(x[j])-longint(x[i]));

if s < min then begin

min := s;

m := i;

end;

end;

writeln(min);

k := p;

while k > 0 do begin

d[k] := m;

m := pr[m, k];

dec(k);

end;

for i := 1 to p-1 do write(x[d[i]], ' ');

writeln(x[d[p]]);

end;

begin

ReadAll;

Solve;

end.

Тема: Работа с большими числами.

Задача 2: Светофоры

В подземелье M тоннелей и N перекрестков, каждый тоннель соединяет какие-то два перекрестка. Мышиный король решил поставить по светофору в каждом тоннеле перед каждым перекрестком. Напишите программу, которая посчитает, сколько светофоров должно быть установлено на каждом из перекрестков. Перекрестки пронумерованы числами от 1 до N.