2. Задача 1. Олимпиада MCA. 100 баллов.
• Входной файл test.in
• Выходной файл test.out
Всякому известен регламент ACM, по этому регламенту
проходит Всероссийская командная олимпиада
школьников по программированию и информатике.
Менее известен альтернативный регламент MCA. Согласно
этому регламенту каждая задача оценивается
определённым количеством баллов. Правильно решённая
задача даёт команде именно столько баллов. Выигрывает
команда, набравшая наибольшее количество баллов. Если
две или более команд набирают одинаковое количество
баллов, то выигрывает команда, решившая наименьшее
количество задач. Если и таких команд оказывается
несколько, то выигрывает команда, имеющая
наименьшее количество попыток сдать задачи (как
успешных, так и безуспешных). Если по-прежнему
победитель не определился, то выигрывает команда с
наименьшим номером. Ваша задача - по итогам MCA
турнира составить итоговую таблицу.
3. • Формат входного файла.
• В первой строке входного файла содержатся два целых числа
T - количество команд и P - количество задач (1 ≤ T ≤ 10, 1 ≤ P ≤
10). Команды пронумерованы от 1 до T, задачи названы
первыми P заглавными буквами латинского алфавита. Во
второй строке записаны P целых чисел из отрезка *1,100+ -
количество баллов, которым оценены задачи. Третья строка
содержит одно целое число S (1 ≤ S ≤ 200) - суммарное
количество сдач за время турнира. В следующих S строках
записаны результаты сдач в формате
• <номер команды> <код задачи> A|R
• буква A (Accepted) означает, что задача принята, буква R
(Rejected) означает, что задача не принята. Данные в этих
строках разделены ровно одним пробелом.
• Формат выходного файла.
• Запишите в выходной файл итоговую таблицу турнира. Таблица
должна занимать T строк, в каждой из которых должен быть
записан номер команды и набранное командой количество
баллов.
4.
5. • var a,b:integer;
• result:longint; Шаг 1
• f, g:text; Создаем файл шаблон, который умеет работать с
• procedure readdata; входными и выходными файлами
• begin
• assign(f,'test.in'); Создаем файлы:
• reset(f); Входной файл test.in
• read(f,a); Выходной файл test.out
• read(f,b); Протестируем программу
• close(f);
• end;
• procedure outdata;
• begin
• assign(g, 'test.out');
• rewrite(g);
• write(g,result);
• close(g);
• end;
• procedure run;
• begin
• result:=a+b;
• end;
• begin
• readdata;
• run;
• outdata;
• end.
6. • Редактируем файл Shablon.pas:
• Var
• T, P: 1..10; {кол-во команд, количество задач}
• B: 1..100; {количество баллов}
• S: 1..200; {количество сдач}
• i:integer; {счетчик для массива}
• MB :array[1..100] of 1..10; {массив для баллов}
• MT :array[1..200] of 1..10; {массив для номеров команд}
• MP :array[1..200] of string; {массив кода задач}
• MAR :array[1..200] of string; {массив для A,R}
• MR :array[1..10] of integer; {массив для
результирующих баллов}
• N :array[1..10] of 1..200; {количество сдач для
каждой команды}
• f, g:text;
7. • Procedure readdata;
Read - читает
• … Readln - читает и
• Readln(f, T , P); переходит на
• For i:=1 to P do новую строку
• Read(f, MB[i]);
• Readln(f, S);
• For i:=1 to S do
• Readln(f, MT[i], MP[i], MAR[i] );
• …
8. • Procedure outdata;
• …
• For i:=1 to T do
• writeln(g, MT[i], ’ ‘, MR[i]);
• …
9. • Итак, наша программа, умеет считать и
выводить нужные данные, теперь наша
задача, научить её обрабатывать их, т.е:
• Подсчитать количество баллов для каждой
задачи, нужно суммировать баллы задач
каждой команды с пометкой
A(Accepted), попутно подсчитывать
количество сдач каждой команды
• В конце выполнить многоуровневую
сортировку сначала по количеству
баллов, потом по количеству сдач, и
наконец, по номеру команды.
10. • Например, если
имеется следующие
результаты
• То, после сортировки
получим таблицу
11. Подсчет баллов и сдач
• {перебираем все сдачи}
• for i:=1 to s do
• Begin
• {подсчитываем количество сдач для каждой
команды}
• for j:=1 to T do
• If MT[i]=j then inc(N[j])
• {подсчитываем количество баллов задач для
каждой команды}
• for k:=1 to P do
• If MP[j]=chr(64+k) then MR[k]:=MB[k]
• End;
13. Задача A. Детали
• Имеется N кг металлического сплава. Из него изготавливают
заготовки массой K кг каждая. После этого из каждой заготовки
вытачиваются детали массой M кг каждая (из каждой заготовки
вытачивают максимально возможное количество деталей).
Если от заготовок после этого что-то остается, то этот материал
возвращают к началу производственного цикла и сплавляют с
тем, что осталось при изготовлении заготовок. Если того сплава,
который получился, достаточно для изготовления хотя бы
одной заготовки, то из него снова изготавливают заготовки, из
них – детали и т.д.
• Напишите программу, которая вычислит, какое количество
деталей может быть получено по этой технологии из
имеющихся исходно N кг сплава.
• Формат входных данных
• Вводятся N, K, M. Все числа натуральные и не превосходят 200.
• Формат выходных данных
• Выведите одно число — количество деталей, которое может
получиться по такой технологии.
15. N
сплав
KZ OZ
K
Заготовка 1 Заготовка 2 Заготовка 3 ост
M
д1 д2 д3 ост1 ост2 ост3
KD
OD
KZ- количество заготовок
OZ- масса остатка от заготовок
KD- количество деталей
OD- масса остатков от деталей
16. Формализация
• Ввод M, N, K
• Нц пока N>=K
• KZ=N div K
• OZ=N mod K
• нц для i от 1 до KZ
• OD=OD+K mod M KD=KD+K div M
• кц
• N=OD+OZ
• кц
• Вывод KD
18. Procedure run Тестирование(отладка
Begin программы)
while n>=k do 10 5 2
begin 4 (!)
KZ:=N div K;
OZ:=N mod K; 13 5 3
for i:=1 to KZ do 18517(?)
begin
OD:=OD+K mod M; 14 5 3
KD:=KD+K div M 19153 (?)
end;
N:=OD+OZ 13 9 4
end; 2 (!)
End;
19. Ручное
N=13 K=5 M=3
тестирование
N цикла N>=K? N KZ OZ OD KD
1 ДА 13 2 3 4 2
2 ДА 7 1 2 6(!) 3
20. Procedure run Тестирование
Begin 10 5 2
while n>=k do 4 (!)
begin
KZ:=N div K; 13 5 3
OZ:=N mod K; 3 (!)
for i:=1 to KZ do
begin 14 5 3
OD:=OD+K mod M; 4 (!)
KD:=KD+K div M
end; 13 9 4
N:=OD+OZ ; OD :=0 2 (!)
end;
End;
21. Анализ
• В процедуре readdata проверять
выполнение условий
• N>K>M
• 0<N≤200, 0<M≤200, 0<K≤200
22. Задача B. Налог
• В некоторой стране инфляция достигла таких размеров, что
доходы граждан стали выражаться числами, количество знаков
в десятичной записи которых доходит до 200. Это сильно
усложнило задачу взимания налогов.
• Один из налогов на доходы составляет 1%. Напишите
программу, которая по введенному числу D (величине дохода
гражданина) вычислит этот налог.
• При этом применяются следующие правила округления:
• Если налог выражается целым числом, то он не округляется.
• Если налог выражается дробным числом, то он округляется в
сторону большего целого (в пользу государства).
• Формат входных данных
• Вводится одно число D (натуральное, 105 ≤ D < 10200) – величина
дохода гражданина.
• Формат выходных данных
• Выведите одно натуральное число – величину налога.
23. моделирование
• N- налог
• D – доход
• Dr – дробная часть
• N = D div 100
• Dr = D mod 100
• пример:
• 13459 div 100 = 134
• 13459 mod 100 = 59
24. формализация
• Ввод D
• N = D div 100
• Dr = D mod 100
• Если Dr>0 то N= N+1
• Вывод N
25. Проблема!
• В ПК нельзя хранить числа с количеством
200 знаков!
• Решение:
• Представим цифры числа как массив
символов ‘0’, ’1’ и т. д.
• 12735387348946353849473663
• Чтобы выделить из строки подстроку будем
использовать функции copy, delete, length
26. • S – длинное число(тип string)
• K:=Length(s) - длина числа
• Dr:=copy(s,k-2,2) – выделить подстроку
• N:=delete(s,k-2,2) – удалить подстроку
• G:= copy(s,k-3,1)
• Val(G,x,code) преобразование символа в
число
• Если Dr<>’00’ то inc(x)
• Str(x,g) преобразование числа в символ
• N := N+g
27. Задача D. Строительство школы
• В деревне Интернетовка все дома расположены вдоль одной
улицы по одну сторону от нее. По другую сторону от этой улицы
пока ничего нет, но скоро все будет – школы, магазины,
кинотеатры и т.д.
• Для начала в этой деревне решили построить школу. Место для
строительства школы решили выбрать так, чтобы суммарное
расстояние, которое проезжают ученики от своих домов до
школы, было минимально.
• План деревни можно представить в виде прямой, в некоторых
целочисленных точках которой находятся дома учеников.
Школу также разрешается строить только в целочисленной
точке этой прямой (в том числе разрешается строить школу в
точке, где расположен один из домов – ведь школа будет
расположена с другой стороны улицы).
• Напишите программу, которая по известным координатам
домов учеников поможет определить координаты места
строительства школы.
30. • Анализируя схему можно прийти к выводу,
что, школа должна быть построена где-то в
середине
или
ш ш
ш
31. • Порядковый номер K школы можно найти
по формуле
• N div 2 + 1,
• где N – количество домов
• Например
• Для N =3 → 3 div 2 + 1 → К=2
• Для N =4 → 4 div 2 + 1 → К=3
• Для N =5 → 5 div 2 + 1 → К=3
32. формализация
Ввод
координат
• Ввод N
• нц для i от 1 до N ввод m[i] кц
• K=N div 2+1
• Вывод m[К]
33. программирование
• Var N: longint;
• K, i:integer;
• m:array[1..100] of longint;
• Procedure readdata;
• …
• Readln(f,N);
• For i:=1 to N do Read(f,m[i]);
• …
• Procedure outdata;
• …
• write(g, m[K]);
• …