SlideShare a Scribd company logo
1 of 34
Олимпиада по
программированию
     2011 год
Задача 1. Олимпиада MCA. 100 баллов.
• Входной файл test.in
• Выходной файл test.out
Всякому известен регламент ACM, по этому регламенту
  проходит Всероссийская командная олимпиада
  школьников по программированию и информатике.
  Менее известен альтернативный регламент MCA. Согласно
  этому регламенту каждая задача оценивается
  определённым количеством баллов. Правильно решённая
  задача даёт команде именно столько баллов. Выигрывает
  команда, набравшая наибольшее количество баллов. Если
  две или более команд набирают одинаковое количество
  баллов, то выигрывает команда, решившая наименьшее
  количество задач. Если и таких команд оказывается
  несколько, то выигрывает команда, имеющая
  наименьшее количество попыток сдать задачи (как
  успешных, так и безуспешных). Если по-прежнему
  победитель не определился, то выигрывает команда с
  наименьшим номером. Ваша задача - по итогам MCA
  турнира составить итоговую таблицу.
• Формат входного файла.
• В первой строке входного файла содержатся два целых числа
  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 строк, в каждой из которых должен быть
  записан номер команды и набранное командой количество
  баллов.
•   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.
•   Редактируем файл 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;
•   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] );
•   …
•   Procedure outdata;
•   …
•   For i:=1 to T do
•   writeln(g, MT[i], ’ ‘, MR[i]);
•   …
• Итак, наша программа, умеет считать и
  выводить нужные данные, теперь наша
  задача, научить её обрабатывать их, т.е:
• Подсчитать количество баллов для каждой
  задачи, нужно суммировать баллы задач
  каждой команды с пометкой
  A(Accepted), попутно подсчитывать
  количество сдач каждой команды
• В конце выполнить многоуровневую
  сортировку сначала по количеству
  баллов, потом по количеству сдач, и
  наконец, по номеру команды.
• Например, если
  имеется следующие
  результаты




• То, после сортировки
  получим таблицу
Подсчет баллов и сдач
•   {перебираем все сдачи}
•   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;
Олимпиада по
программированию
     2010 год
Задача A. Детали
• Имеется N кг металлического сплава. Из него изготавливают
  заготовки массой K кг каждая. После этого из каждой заготовки
  вытачиваются детали массой M кг каждая (из каждой заготовки
  вытачивают максимально возможное количество деталей).
  Если от заготовок после этого что-то остается, то этот материал
  возвращают к началу производственного цикла и сплавляют с
  тем, что осталось при изготовлении заготовок. Если того сплава,
  который получился, достаточно для изготовления хотя бы
  одной заготовки, то из него снова изготавливают заготовки, из
  них – детали и т.д.
• Напишите программу, которая вычислит, какое количество
  деталей может быть получено по этой технологии из
  имеющихся исходно N кг сплава.
• Формат входных данных
• Вводятся N, K, M. Все числа натуральные и не превосходят 200.
• Формат выходных данных
• Выведите одно число — количество деталей, которое может
  получиться по такой технологии.
Моделирование
N
                      сплав
KZ                                                 OZ
          K
 Заготовка 1     Заготовка 2       Заготовка 3   ост

     M
д1       д2    д3    ост1          ост2          ост3

         KD
                                          OD
 KZ- количество заготовок
 OZ- масса остатка от заготовок
 KD- количество деталей
 OD- масса остатков от деталей
Формализация
•   Ввод 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
программирование
•   Var N, M, K: byte;
•   Od, oz, kd, kz,i: byte;
•   Procedure readdata;
•   …
•   Read(f,N); Read(f,M); Read(f,K);
•   …
•   Procedure outdata;
•   …
•   write(g,KD);
•   …
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;
Ручное
                                 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
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;
Анализ
• В процедуре readdata проверять
  выполнение условий
• N>K>M
• 0<N≤200, 0<M≤200, 0<K≤200
Задача B. Налог
• В некоторой стране инфляция достигла таких размеров, что
  доходы граждан стали выражаться числами, количество знаков
  в десятичной записи которых доходит до 200. Это сильно
  усложнило задачу взимания налогов.
• Один из налогов на доходы составляет 1%. Напишите
  программу, которая по введенному числу D (величине дохода
  гражданина) вычислит этот налог.
• При этом применяются следующие правила округления:
• Если налог выражается целым числом, то он не округляется.
• Если налог выражается дробным числом, то он округляется в
  сторону большего целого (в пользу государства).
• Формат входных данных
• Вводится одно число D (натуральное, 105 ≤ D < 10200) – величина
  дохода гражданина.
• Формат выходных данных
• Выведите одно натуральное число – величину налога.
моделирование
•   N- налог
•   D – доход
•   Dr – дробная часть
•   N = D div 100
•   Dr = D mod 100
•   пример:
•   13459 div 100 = 134
•   13459 mod 100 = 59
формализация
•   Ввод D
•   N = D div 100
•   Dr = D mod 100
•   Если Dr>0 то N= N+1
•   Вывод N
Проблема!
• В ПК нельзя хранить числа с количеством
  200 знаков!
• Решение:
• Представим цифры числа как массив
  символов ‘0’, ’1’ и т. д.
• 12735387348946353849473663
• Чтобы выделить из строки подстроку будем
  использовать функции copy, delete, length
• 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
Задача D. Строительство школы
• В деревне Интернетовка все дома расположены вдоль одной
  улицы по одну сторону от нее. По другую сторону от этой улицы
  пока ничего нет, но скоро все будет – школы, магазины,
  кинотеатры и т.д.
• Для начала в этой деревне решили построить школу. Место для
  строительства школы решили выбрать так, чтобы суммарное
  расстояние, которое проезжают ученики от своих домов до
  школы, было минимально.
• План деревни можно представить в виде прямой, в некоторых
  целочисленных точках которой находятся дома учеников.
  Школу также разрешается строить только в целочисленной
  точке этой прямой (в том числе разрешается строить школу в
  точке, где расположен один из домов – ведь школа будет
  расположена с другой стороны улицы).
• Напишите программу, которая по известным координатам
  домов учеников поможет определить координаты места
  строительства школы.
моделирование
-1          0                   1

     ш
                    S=0+1+2=3


-1       0                      1

         ш
                 S=1+0+1=2


-1       0                   1

                             ш
                 S=2+1+0=3
• Анализируя схему можно прийти к выводу,
  что, школа должна быть построена где-то в
  середине
                            или

            ш           ш




                   ш
• Порядковый номер 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
формализация
                                        Ввод
                                      координат
•   Ввод N
•   нц для i от 1 до N ввод m[i] кц
•   K=N div 2+1
•   Вывод m[К]
программирование
•   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]);
•   …
Procedure run
Begin
K:=N div 2+1
End;

More Related Content

What's hot

05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программированиеFedor Tsarev
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Nikolay Grebenshikov
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JSFestUA
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Nikolay Grebenshikov
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применениеDEVTYPE
 
презентация
презентацияпрезентация
презентацияLIANA180
 

What's hot (8)

05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
05 динамическое программирование
05 динамическое программирование05 динамическое программирование
05 динамическое программирование
 
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
Лекция №15. Методы программирования. Предмет "Структуры и алгоритмы обработки...
 
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
JS Fest 2019/Autumn. Adam Leos. So why do you need to know Algorithms and Dat...
 
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
Лекция №3. Анализ алгоритмов. Предмет "Структуры и алгоритмы обработки данных"
 
D-кучи и их применение
D-кучи и их применениеD-кучи и их применение
D-кучи и их применение
 
Lektsia 9
Lektsia 9Lektsia 9
Lektsia 9
 
презентация
презентацияпрезентация
презентация
 

Similar to олимпиада2011

Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...2berkas
 
Паскаль
ПаскальПаскаль
Паскальsift91
 
Программирование циклических алгоритмов
Программирование циклических алгоритмовПрограммирование циклических алгоритмов
Программирование циклических алгоритмовAndrey Dolinin
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.sharikdp
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс2berkas
 
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Dmitry Kornev
 
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Bitworks Software
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1igorm9so
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмdasha2012
 
введение
введениевведение
введениеAndEdr
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Yandex
 
циклы
циклыциклы
циклыAndEdr
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and ClojureVasil Remeniuk
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняAlexander Granin
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовMikhail Kurnosov
 
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)Ontico
 

Similar to олимпиада2011 (20)

Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
Презентация на тему: Методика подготовки учащихся к итоговой аттестации по ин...
 
Паскаль
ПаскальПаскаль
Паскаль
 
Программирование циклических алгоритмов
Программирование циклических алгоритмовПрограммирование циклических алгоритмов
Программирование циклических алгоритмов
 
8 3-5
8 3-58 3-5
8 3-5
 
чернякова г.в.
чернякова г.в.чернякова г.в.
чернякова г.в.
 
презентация1
презентация1презентация1
презентация1
 
Презентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 классПрезентация на тему: Повторение курса информатики 7 класс
Презентация на тему: Повторение курса информатики 7 класс
 
инф 9 демо 2015
инф 9 демо 2015инф 9 демо 2015
инф 9 демо 2015
 
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
 
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
Введение в машинное обучение. Кластеризация (Bitworks Software, Кирилл Жданов)
 
паскаль. часть1
паскаль. часть1паскаль. часть1
паскаль. часть1
 
тема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритмтема 2.операторы.линейный алгоритм
тема 2.операторы.линейный алгоритм
 
введение
введениевведение
введение
 
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
Евгений Крутько — Опыт внедрения технологий параллельных вычислений для повыш...
 
Python
PythonPython
Python
 
циклы
циклыциклы
циклы
 
DSLs in Lisp and Clojure
DSLs in Lisp and ClojureDSLs in Lisp and Clojure
DSLs in Lisp and Clojure
 
Back to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодняBack to the future: Функциональное программирование вчера и сегодня
Back to the future: Функциональное программирование вчера и сегодня
 
Лекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмовЛекция 11. Методы разработки алгоритмов
Лекция 11. Методы разработки алгоритмов
 
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
Быстрая оценка ИТ-проекта (Максим Русаков, Григорий Колесников)
 

олимпиада2011

  • 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
  • 17. программирование • Var N, M, K: byte; • Od, oz, kd, kz,i: byte; • Procedure readdata; • … • Read(f,N); Read(f,M); Read(f,K); • … • Procedure outdata; • … • write(g,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. Строительство школы • В деревне Интернетовка все дома расположены вдоль одной улицы по одну сторону от нее. По другую сторону от этой улицы пока ничего нет, но скоро все будет – школы, магазины, кинотеатры и т.д. • Для начала в этой деревне решили построить школу. Место для строительства школы решили выбрать так, чтобы суммарное расстояние, которое проезжают ученики от своих домов до школы, было минимально. • План деревни можно представить в виде прямой, в некоторых целочисленных точках которой находятся дома учеников. Школу также разрешается строить только в целочисленной точке этой прямой (в том числе разрешается строить школу в точке, где расположен один из домов – ведь школа будет расположена с другой стороны улицы). • Напишите программу, которая по известным координатам домов учеников поможет определить координаты места строительства школы.
  • 29. -1 0 1 ш S=0+1+2=3 -1 0 1 ш S=1+0+1=2 -1 0 1 ш S=2+1+0=3
  • 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]); • …