- •Ответы на задачи с4:
- •Var tMonth: array[1..12] of real;
- •I, month: integer;
- •Var count: array[1..26] of integer;
- •Var count:array[1..26] of integer;
- •I, k, cA, cAm, iMax:integer;
- •Var count: array ['a'..'z'] of integer;
- •Var Info: array[1..100] of record
- •Var Info: array[1..100] of record
- •I, k, p, n, c: integer;
- •Var Info: array[1..Lim] of record
- •I, k, n, mark, max: integer;
- •Var names: array[1..Lim] of string;
- •I, k, n, ball, mark, max, count: integer;
- •Var Info: array[1..Lim] of record
- •I, k, n, mark, max1, max2, max3: integer;
- •Var name: array[1..Lim] of string;
- •I, k, count, mark1, mark2, n: integer;
- •Var podr: array[1..100] of integer;
- •Var podr: array[0..99] of boolean;
- •I, k, p, count, n: integer;
- •Var ballBest: array[1..2] of integer; { результат (баллы) }
- •Var ballBest: array[1..2] of integer;
- •I, j, k, ball: integer; { вспомогательные переменные }
- •Var Best: array[1..2] of record
- •I, j, k, ball: integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •I, j, k, price: integer;
- •Var Total: array[0..Max] of integer;
- •Var Count: array[0..Max,7..11] of integer;
- •I, j, class, ball, minBall, Sum: integer;
- •Var List: array[1..500] of string;
- •Var List: array[1..500] of string;
- •I, j, n, ball1, ball2, count: integer;
- •Var List: array[1..500] of string;
- •I, j, n, ball1, ball2, count: integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •Var MinPrice, Count: array[1..3] of integer;
- •I, j, k, price: integer;
- •Var count: array[1..26] of integer;
- •Var count: array['a'..'z'] of integer;
- •Inc(nOdd);
- •Var count: array['a'..'z'] of integer;
- •I, nOdd: integer;
- •Inc(nOdd);
- •Var Info: array[1..1000] of tInfo;
- •Var temp: tInfo;
- •Var Info: array[1..1000] of tInfo;
- •Var h, m, code0: integer;
- •Var Info: array[1..1000] of tInfo;
- •Var Info: array[1..1000] of tInfo;
- •Var h, m, code0: integer;
- •If c in ['a'..'z', 'a'..'z'] then ...
- •If c in['a'..'z','a'..'z'] then
- •If s[I] in ['a'..'z','a'..'z'] then begin
- •Var Names: array[1..Max] of string;
- •Var count: array[1..Max] of integer;
- •Var nParties: integer;
- •Var Names: array[1..Max] of string;
- •Var Parties: array[1..Max] of tParty;
- •Var Parties: array[1..Max] of tParty;
- •Val(Copy(s,1,2), d, c);
- •Val(Copy(s,4,2), m, c);
- •Val(Copy(s,7,4), y, c);
- •Var s, Name, minName: string;
- •Val(Copy(s,1,2), d, c);
- •Val(Copy(s,4,2), m, c);
- •Val(Copy(s,7,4), y, c);
- •Var s, Name, specDate, minName, minDate: string;
- •Var name,name1,name2:string;
- •I, j, n, school, ball,
- •Var sum, count: array[1..99] of integer;
- •Var sum, count: array[1..99] of integer;
- •I, n, sch, ball, k, total: integer;
- •If s[I] in ['a'..'z','a'..'z'] then
- •If inside then begin
- •Var count:array[0..100] of integer;
- •I, n, sch, ball, m, s: integer;
- •Var c: char;
- •I, k, count: integer;
- •Var c, I: char;
- •Var c: char;
- •I, j, k: integer;
- •Var c:char;
- •I, j, k:integer;
- •Var num: array['0'..'9'] of integer;
- •I, min: integer;
- •Var c: char;
- •I, k, count: integer;
- •Var c, I: char;
- •Var c: char;
- •Var num: array['1'..'9'] of integer;
- •Var num: array['1'..'9'] of integer;
- •Val(Copy(s,1,2), d, I);
- •Val(Copy(s,4,2), m, I);
- •Var maxStip: array[1..5] of integer;
- •Var I, k, n: integer;
- •Var first: array[1..5] of integer;
- •Var I, n, kurs, stip: integer;
- •Var people: array[1..Max-1] of integer;
- •Var Delta: array[1..Max] of integer;
- •Var Delta: array[1..Max] of integer;
- •I, s1, s2, n, p, min: integer;
- •Var people: array[1..Max-1] of integer;
- •I, j, s1, s2, n, p, min: integer;
- •Var schMax, schCount: array[1..Max] of integer;
- •Var schMax, schCount: array[1..Max] of integer;
- •I, n, sch, ball, count: integer;
- •Var f: Text; { указатель на текстовый файл }
- •X1, x2: real; { корни уравнения }
- •I, r: integer; { вспомогательные переменные }
- •Var Info: array[1..Max] of tInfo;
- •Var Info: array[1..Max] of tInfo;
- •I, j, n, zNo: integer;
- •Var count: array[1..Max] of integer;
- •Var count: array[1..Max] of integer;
- •I, j, nMin, n, zNo: integer;
- •Var Info: array[1..Max] of tInfo;
- •I, j, n, k: integer;
- •76 Http://kpolyakov.Narod.Ru
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), однако при вводе данных получили вложенный цикл, что можно считать несколько неэффективным по скорости выполнения.
Какой вариант лучше? Как всегда, решение – это компромисс между быстродействием и расходуемой памятью. Есть надежда, что и в том, и в другом случае эксперт не будет снижать балл за неэффективность.
-
Нужно завести массивы, в одном из которых будем хранить максимальные баллы по каждой школе, а в другом – число учеников, получивших этот максимальный балл:
const MAX = 99;
Var schMax, schCount: array[1..Max] of integer;
В начале оба массива обнуляются:
for i:=1 to MAX do begin
schMax[i] := 0;
schCount[i] := 0;
end;
В этой задаче фамилии и имена нам не нужны, при чтении их можно пропускать. Дойдя до второго пробела, читаем номер школы и балл в целые переменные sch и ball:
repeat read(c) until c = ' ';
repeat read(c) until c = ' ';
readln(sch, ball);
Если балл текущего ученика равен максимальному, увеличиваем счетчик максимальных баллов для этой школы:
if ball = schMax[sch] then
schCount[sch] := schCount[sch] + 1;
Если балл текущего ученика больше предыдущего максимального, записываем новый максимум и сбрасываем счетчик максимальных баллов для этой школы в единицу:
if ball > schMax[sch] then begin
schMax[sch] := ball;
schCount[sch] := 1;
end;
После чтения всех N строк (в цикле) нужно искать максимум в массиве schMax. Попутно (чтобы не делать второй цикл) ищем наибольшее значение счетчика среди всех школ, у которых наибольший балл. Сначала считаем, что лучшая школа – первая:
ball := schMax[1];
count := schCount[1];
Затем в цикле просматриваем все остальные школы. Если балл равен максимальному, ищем наибольшее значение счетчика:
if (schMax[i] = ball) and (schCount[i] > count) then
count := schCount[i];
Если балл больше предыдущего максимального, запоминаем новое максимальное значение и новое значение счетчика:
if schMax[i] > ball then begin
ball := schMax[i];
count := schCount[i];
end;
В конце программы выводим номера школ, в которых и балл, и счетчик равны найденным максимальным значениям:
for i:=1 to MAX do
if (schMax[i] = ball) and (schCount[i] = count) then
writeln(i)
Вот полная программа:
const MAX = 99;