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

Сортировка и поиск Независимые судьи

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

Пусть n (n ≥ 3) судей выставили одному из спортсменов соответственно оценки: а1, а2, …, аn. Определить, какая итоговая оценка пойдёт спортсмену в зачёт.

Во входном файле input.txt в первой строке дано количество судей n, во второй – баллы первого судьи, в третьей – баллы второго судьи и т. д., в n+1 строке – баллы n-го судьи. В выходном файле output.txt содержится одно число – итоговая оценка спортсмена.

Пример входного и выходного файлов

input.txt

output.txt

6

34

56

2

33

5

6

19.5

Независимые судьи Решение

program sport;

var n, i, max, min, s:integer;

a:array[1..100] of integer;

sr: real;

f, g: text;

begin

assign (f,'input.txt');

assign (g,'output.txt');

reset (f);

readln (f, n); //чтение из файла количества судей

for i:=1 to n do

readln (f, a[i]); //чтение из файла оценок судей

close (f);

max:=a[1];

min:=a[1];

for i:=2 to n do

begin

if a[i]>=max then max:=a[i]; //нахождение max и min оценок

if a[i]<=min then min:=a[i];

end;

s:=0;

for i:=1 to n do

begin

s:=s+a[i]; //нахождение суммы всех оценок

end;

s:=s-max-min; //изымание max и min оценок из общей суммы

sr:=s/(n-2); //нахождение среднего арифметического оценок

rewrite (g);

writeln (g, sr);

close (g);

end.

Длинная арифметика

Сувениры

Два брата-путешественника независимо друг от друга совершили кругосветное путешествие. Они посетили не менее 10 и не более 500 населенных пунктов, и в каждом населенном пункте могли купить сувениры (не более 9). Встретившись, каждый из братьев записал в файл data.txt строку со своим числом, каждая цифра которого означала количество сувениров, купленных в отдельном населенном пункте.

Задание. Помогите братьям найти сумму полученных таким образом чисел и записать ее в выходной файл sum.txt.

Примеры входного и выходного файлов

data.txt

sum.txt

5273910548975

4720150081128349

4725423991677324

Сувениры Решение

program files1;

type mass=array [1..500] of integer;

var f1, f2: text; s, q, t, d, y: string; a, b, c: mass; i, n, k, r, max, p: integer;

begin

assign (f1,'data.txt'); //связь файловой переменной с входным файлом

reset (f1);

readln (f1, s); // считывание первого слагаемого в виде строки символов

readln (f1, q); // считывание второго слагаемого в виде строки символов

n:=length (s); //длина первого числа

// каждый символ первого числа превращается в цифру (числовой формат) и записывается в массив а, причем самый правый символ – младший разряд числа

for i:= n downto 1 do

begin

t:=copy (s, i, 1);

val (t, r);

a[n-i+1] := r;

end;

// каждый символ второго числа превращается в цифру (числовой формат) и записывается в массив b, причем самый правый символ – младший разряд числа

k:=length (q); // длина второго числа

for i:=k downto 1 do

begin

t:=copy (q, i, 1);

val (t, r);

b[k-i+1]:=r;

end;

close (f1); // закрываем файловую переменную

// определяем размер массива, в котором будет храниться сумма чисел

if n>k then max:=n else max:=k;

// р – сумма цифр соответствующих разрядов

p:=0;

for i:=1 to max do

// формирование цифр в числе-сумме с учетом перехода через десяток

begin

p:=a[i]+b[i]+p div 10;

c[i]:=p mod 10;

end;

// //массив с результатом преобразуется в строковую переменную у и посимвольно накапливается в строке d таким образом, чтобы слева начинались старшие разряды суммы

if p>=10 then c[max]:=c[max]+10; // учитывается, что сумма старших разрядов может быть больше 9, поэтому первая цифра в результате – 1.

for i:=max downto 1 do

begin str(c[i],y); d:=d+y end;

assign (f2,'sum.txt'); // файловая переменная связывается с выходным файлом

rewrite (f2); // подготовка выходного файла для записи

write (f2,d); // запись результата в выходной файл

close (f2); // закрытие выходного файла

end.

Метод перебора вариантов