Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kpolyakov.narod.ru answC4.doc
Скачиваний:
0
Добавлен:
09.12.2018
Размер:
566.78 Кб
Скачать

Var I, n, kurs, stip: integer;

c: char;

maxStip, first: array[1..5] of integer;

stud: array[1..MAX] of TStud;

begin

for i:=1 to 5 do begin

maxStip[i] := 0; first[i] := 0;

end;

readln(N);

for i:=1 to N do begin

stud[i].name := '';

repeat read(c); stud[i].name := stud[i].name + c;

until c = ' ';

repeat read(c); stud[i].name := stud[i].name + c;

until c = ' ';

readln(kurs, stip);

if stip = maxStip[kurs] then begin

stud[i].next:= first[kurs];

first[kurs]:= i;

end;

if stip > maxStip[kurs] then begin

maxStip[kurs]:= stip;

first[kurs]:= i;

end;

end;

for kurs:=1 to 5 do

if maxStip[kurs] > 0 then begin

writeln('Курс ', kurs);

i := first[kurs];

repeat

writeln(stud[i].name);

i := stud[i].next;

until i = 0;

end;

end.

  1. Понятно, что в этой задаче нужно ввести массив, в котором будем хранить число пассажиров на каждом перегоне (перегонов всегда на 1 меньше, чем станций):

const MAX = 10;

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

В самом начале все элементы массива должны быть равны нулю.

Не очень ясно, как проще считать пассажиров на каждом перегоне. Пусть очередной пассажир вошел на станции с номером s1 и вышел на станции s2. Тогда на всех перегонах от s1 до s2-1 нужно увеличить соответствующие значения массива people, что не очень эффективно – появляется дополнительный внутренний цикл.

Значительно лучше при вводе данных считать, на сколько изменилось количество пассажиров на каждой станции. Введем соответствующий массив Delta:

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;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]