Как могут соотноситься между собой числа: (a) одно число 0, второе - нечетное в промежутке [1, 27] (получается, если в исходном числе одна четная цифра - 0 - и три нечетных, или три нуля и одно нечетное) (b) одно число 0, второе - четное в промежутке [2, 36] (получается, если в исходном числе нет нечетных цифр или нет четных цифр или два нуля и две нечетные цифры) (с) одно число четное в промежутке [2, 8], второе нечетное в промежутке [3, 27] (получается, если одна чётная цифра и три нечётных) (d) одно число четное в промежутке [2, 24], второе нечетное в промежутке [1, 9] (получается, если одна нечётная цифра и три четных) (e) оба числа четные, одно в промежутке [2, 18], второе в промежутке [2, 16] (получается, если две чётных цифры и две нечётных)
Дальше каждое число (кроме 370) разбито на 2, в скобках стоит тот случай, под который подпадает число 236: 23, 6 (c, +) 1313: 13, 13 (-) 270: 27, 0 (a, +) 1114: 11, 14 (<, -) 1614: 16, 14 (e, +) 187: 18, 7 (c, +) 370: - (-) 294: 29, 4 (-) 40: 4, 0 (b, +) ответ. 5 чисел
type cName = string[20]; RC = record position: byte; name: cName; nGold: byte; nSilver: byte; nBronze: byte; cTotal: byte end; tM = array[1..nMax, 1..2] of byte;
procedure Shell(var a: tM; n: integer); { Сортировка методом Шелла массива a[1..n, 1..2] по убыванию значений элементов второго столбца. } var i, j, step, t1, t2: integer;
begin step := n div 2; while step > 0 do begin for j := n - step downto 1 do begin i := j; while i <= n - step do begin if a[i, 2] < a[i + step, 2] then begin t1 := a[i, 1]; t2 := a[i, 2]; a[i, 1] := a[i + 1, 1]; a[i, 2] := a[i + 1, 2]; a[i + 1, 1] := t1; a[i + 1, 2] := t2 end; i := i + step end end; step := step div 2 end end;
{ Основная программа } var f: file of RC; a: tM; i, n: byte; s: cName; t: RC;
begin { Организуем ввод данных } Assign(f, 'Olympic.in'); Rewrite(f); n := 0; repeat Writeln('Введите наименование команды или * для окончания ввода'); Readln(s); if s[1] <> '*' then begin n := n + 1; Write('Количество медалей: золото, серебро, бронза: '); Readln(t.nGold, t.nSilver, t.nBronze); t.position := n; t.name := s; t.cTotal := t.nGold * cGold + t.nSilver * cSilver + t.nBronze * cBronze; Write(f, t); a[n, 1] := t.position; a[n, 2] := t.cTotal end until s[1] = '*'; Reset(f); { Выполняем сортировку заполненного массива a, определяя положение записей в файле } Shell(a, n); { Выводим результаты, используя прямой доступ к файлу } Writeln('Результаты олимпиады'); for i := 1 to n do begin seek(f, a[i, 1] - 1); Read(f, t); Writeln(i, ': ', t.name, '(', t.nGold, ' зол, ', t.nSilver, ' сер, ', t.nBronze, ' бронз), очков- ', t.cTotal) end; Close(f); end.
Тестовое решение: Введите наименование команды или * для окончания ввода Веселые медузы Количество медалей: золото, серебро, бронза: 4 6 10 Введите наименование команды или * для окончания ввода Юные сурки Количество медалей: золото, серебро, бронза: 2 0 5 Введите наименование команды или * для окончания ввода Черепашки-ниндзя Количество медалей: золото, серебро, бронза: 3 7 11 Введите наименование команды или * для окончания ввода * Результаты олимпиады 1: Черепашки-ниндзя(3 зол, 7 сер, 11 бронз), очков- 118 2: Веселые медузы(4 зол, 6 сер, 10 бронз), очков- 114 3: Юные сурки(2 зол, 0 сер, 5 бронз), очков- 39
(a) одно число 0, второе - нечетное в промежутке [1, 27] (получается, если в исходном числе одна четная цифра - 0 - и три нечетных, или три нуля и одно нечетное)
(b) одно число 0, второе - четное в промежутке [2, 36] (получается, если в исходном числе нет нечетных цифр или нет четных цифр или два нуля и две нечетные цифры)
(с) одно число четное в промежутке [2, 8], второе нечетное в промежутке [3, 27] (получается, если одна чётная цифра и три нечётных)
(d) одно число четное в промежутке [2, 24], второе нечетное в промежутке [1, 9] (получается, если одна нечётная цифра и три четных)
(e) оба числа четные, одно в промежутке [2, 18], второе в промежутке [2, 16] (получается, если две чётных цифры и две нечётных)
Дальше каждое число (кроме 370) разбито на 2, в скобках стоит тот случай, под который подпадает число
236: 23, 6 (c, +)
1313: 13, 13 (-)
270: 27, 0 (a, +)
1114: 11, 14 (<, -)
1614: 16, 14 (e, +)
187: 18, 7 (c, +)
370: - (-)
294: 29, 4 (-)
40: 4, 0 (b, +)
ответ. 5 чисел
const
nMax = 50; { максимум 50 команд }
cGold = 7;
cSilver = 6;
cBronze = 5;
type
cName = string[20];
RC = record
position: byte;
name: cName;
nGold: byte;
nSilver: byte;
nBronze: byte;
cTotal: byte
end;
tM = array[1..nMax, 1..2] of byte;
procedure Shell(var a: tM; n: integer);
{ Сортировка методом Шелла массива a[1..n, 1..2]
по убыванию значений элементов второго столбца. }
var
i, j, step, t1, t2: integer;
begin
step := n div 2;
while step > 0 do
begin
for j := n - step downto 1 do
begin
i := j;
while i <= n - step do
begin
if a[i, 2] < a[i + step, 2] then
begin
t1 := a[i, 1]; t2 := a[i, 2];
a[i, 1] := a[i + 1, 1]; a[i, 2] := a[i + 1, 2];
a[i + 1, 1] := t1; a[i + 1, 2] := t2
end;
i := i + step
end
end;
step := step div 2
end
end;
{ Основная программа }
var
f: file of RC;
a: tM;
i, n: byte;
s: cName;
t: RC;
begin
{ Организуем ввод данных }
Assign(f, 'Olympic.in');
Rewrite(f);
n := 0;
repeat
Writeln('Введите наименование команды или * для окончания ввода');
Readln(s);
if s[1] <> '*' then
begin
n := n + 1;
Write('Количество медалей: золото, серебро, бронза: ');
Readln(t.nGold, t.nSilver, t.nBronze);
t.position := n;
t.name := s;
t.cTotal := t.nGold * cGold + t.nSilver * cSilver + t.nBronze * cBronze;
Write(f, t);
a[n, 1] := t.position; a[n, 2] := t.cTotal
end
until s[1] = '*';
Reset(f);
{ Выполняем сортировку заполненного массива a,
определяя положение записей в файле }
Shell(a, n);
{ Выводим результаты, используя прямой доступ к файлу }
Writeln('Результаты олимпиады');
for i := 1 to n do
begin
seek(f, a[i, 1] - 1);
Read(f, t);
Writeln(i, ': ', t.name, '(', t.nGold, ' зол, ', t.nSilver, ' сер, ',
t.nBronze, ' бронз), очков- ', t.cTotal)
end;
Close(f);
end.
Тестовое решение:
Введите наименование команды или * для окончания ввода
Веселые медузы
Количество медалей: золото, серебро, бронза: 4 6 10
Введите наименование команды или * для окончания ввода
Юные сурки
Количество медалей: золото, серебро, бронза: 2 0 5
Введите наименование команды или * для окончания ввода
Черепашки-ниндзя
Количество медалей: золото, серебро, бронза: 3 7 11
Введите наименование команды или * для окончания ввода
*
Результаты олимпиады
1: Черепашки-ниндзя(3 зол, 7 сер, 11 бронз), очков- 118
2: Веселые медузы(4 зол, 6 сер, 10 бронз), очков- 114
3: Юные сурки(2 зол, 0 сер, 5 бронз), очков- 39