Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
24
Добавлен:
19.05.2015
Размер:
719.36 Кб
Скачать

Var Delta: array[1..Max] of integer;

Тогда, если очередной пассажир вошел на станции с номером s1 и вышел на станции s2, нужно увеличить на 1 значение Delta[s1] и уменьшить на 1 значение Delta[s2]:

Delta[s1]:= Delta[s1] + 1;

Delta[s2]:= Delta[s2] - 1

При чтении фамилию и имя пассажира мы просто пропускаем – они нас не интересуют. Полный цикл чтения данных выглядит так:

for i:= 1 to P do begin

repeat read(c) until c = ' ';

repeat read(c) until c = ' ';

readln(s1, s2);

Delta[s1] := Delta[s1] + 1;

Delta[s2] := Delta[s2] - 1

end;

Теперь можно заполнить массив people. На первом перегоне в поезде было Delta[1] человек, а на каждой следующей станции (с номером i) количество увеличивалось в сравнении с предыдущим на Delta[i]:

people[1] := Delta[1];

for i:=2 to N-1 do

people[i]:= people[i-1] + Delta[i];

Теперь остается найти минимум:

min := P;

for i:=1 to N-1 do

if people[i] < min then

min := people[i];

и вывести на экран перегоны, где количество пассажиров равно минимальному:

for i:=1 to N-1 do

if people[i] = min then

writeln(i, '-', i+1)

Вот полная программа:

const MAX = 10;

Var Delta: array[1..Max] of integer;

people: array[1..MAX-1] of integer;

I, s1, s2, n, p, min: integer;

c: char;

begin

readln(N, P);

for i:=1 to N do Delta[i] := 0;

for i:= 1 to P do begin

repeat read(c) until c = ' ';

repeat read(c) until c = ' ';

readln(s1, s2);

Delta[s1] := Delta[s1] + 1;

Delta[s2] := Delta[s2] - 1

end;

people[1] := Delta[1];

for i:=2 to N-1 do

people[i]:= people[i-1] + Delta[i];

min := P;

for i:=1 to N-1 do

if people[i] < min then

min := people[i];

for i:=1 to N-1 do

if people[i] = min then

writeln(i, '-', i+1)

end.

Возможен и другой вариант, когда массив Delta не нужен: прочитав s1 и s2, мы сразу добавляем по 1 человеку на все перегоны между указанными станциями. Цикл ввода приобретает такой вид:

for i:= 1 to P do begin

repeat read(c) until c = ' ';

repeat read(c) until c = ' ';

readln(s1, s2);

for j:=s1 to s2-1 do

people[j] := people[j] + 1;

end;

И вот полная программа:

const MAX = 10;

Var people: array[1..Max-1] of integer;

I, j, s1, s2, n, p, min: integer;

c: char;

begin

readln(N, P);

for i:=1 to N do Delta[i] := 0;

for i:= 1 to P do begin

repeat read(c) until c = ' ';

repeat read(c) until c = ' ';

readln(s1, s2);

for j:=s1 to s2-1 do

people[j] := people[j] + 1;

end;

min := P;

for i:=1 to N-1 do

if people[i] < min then

min := people[i];

for i:=1 to N-1 do

if people[i] = min then

writeln(i, '-', i+1)

end.

Оба решения имеют небольшие недостатки. В первом используется дополнительный массив Delta (расход памяти), но все циклы простые, не вложенные. Поэтому алгоритм имеет линейную сложность – количество операций при больших N и P возрастает почти по линейной зависимости относительно обеих величин.

Во втором решении мы сэкономили память (нет массива Delta), однако при вводе данных получили вложенный цикл, что можно считать несколько неэффективным по скорости выполнения.

Какой вариант лучше? Как всегда, решение – это компромисс между быстродействием и расходуемой памятью. Есть надежда, что и в том, и в другом случае эксперт не будет снижать балл за неэффективность.

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

const MAX = 99;

Соседние файлы в папке ЕГЗ_2012_Поляков_май