Отправляет email-рассылки с помощью сервиса Sendsay

Олимпиады на Turbo Pascal'е

  Все выпуски  

Turbo Pascal для школьников Выпуск N20


Информационный Канал Subscribe.Ru


Turbo Pascal для школьников

Выпуск №20
Перейти в архив>>

   Доброго времени суток, уважаемый подписчики!!!
Сегодня, как я и обещал, мы поговорим с вами о работе с типом запись. Итак, приступим.
Когда мы проходили массив, мы говорили о том, что это несколько элементов одного типа. Заметьте, что далеко не всегда нам нужны, например, только целочисленные данные. Иногда может потребоваться комментарий к числам (string) и т. д. Именно для этого придумали специальный тип данных - запись.
Обычно перед тем, как создать переменную-запись, создают специальный тип (в принципе, можно обходиться и без него), в котором перечисляются элементы входящие в нашу запись. В отличие от массива, тут нет никаких индексов, все элементы имеют определенное имя и тип. Приведу пример описания типа turnir, содержащий информацию о человеке (его nick-name) и кол-во очков у данного человека в турнирной таблице:

    type
      turnir = record
        human: string;
        bal: integer;
      end;
Обратите внимание, чтобы указать, что дальше идёт описание записи, мы используем после знака равно зарезервированное слово record. Далее идут описания элементов записи (они называются полями записи) и описание самой записи заканчивается end;
В принципе ничего сложного тут нет. Теперь перейдём к тому, как можно обратиться к полю записи. При работе с массивом мы в [] указывали индекс элемента. При работе же с записью мы должны указать имя переменной типа запись, а дальше, после точки указать имя поля, с которым Вы собираетесь работать в данный момент. Разберем это на нашем же примере.
    var
      a:turnir;
    begin
      a.human:='Иванов Пётр Иванович';
      a.bal:=10;
    end;
В этом фрагменте мы используем уже описанный ранее тип запись turnir. В нашем типа всего 2 поля, но полей может быть намного больше. Чтобы при работе с одной и той же записью не писать имя переменной типа запись, можно воспользоваться конструкцией with. Например, в предыдущем примере операторы присваивания можно было оформить так:
    with a do begin
      human:='Иванов Пётр Иванович';
      bal:=10;
    end;
Ну вот теперь Вы умеете работать с записями. Надеюсь, Вы сможете найти им применение при решении задач. Обычно создают не одну запись, а массив, состоящий из записей. Это также очень удобно.

   Теоретический блок на этом окончен. Теперь переходим к нашему турниру.
С сегодняшнего дня в условиях турнира произошли некоторые изменения. Теперь начисление баллов будет происходить следующим образом: тот, кто присылает решение в первый день после публикования (среда или воскресенье) получает 20 баллов за правильное решение задачи и -2, при посылке неправильного решения. Тот, кто посылает в четверг или понедельник - по 15 баллов за правильное решение и также -2 за неправильное. И наконец, кто присылает решение в остальные дни (пятница, суббота, вторник), тот получает всего лишь 10 баллов за правильное решение, и -2 за неправильное. Теперь Вы можете не торопиться и тщательней проверять работу Ваших "детищ".
Кроме того, начиная с сегодняшнего 20 выпуска рассылки, я буду публиковать не одну турнирную задачу, а целых 2.

   Теперь переходим непосредственно к задачам:

№1. "Спираль"

    Робот-минер новейшей конструкции способен провести разминирование местности, план которой должен быть представлен в виде прямоугольника с целыми длинами сторон (n - высота прямоугольника, m - длина прямоугольника). Перед началом работы робота размещают перед левой верхней клеткой прямоугольника в направлении "слева-направо", после чего робот начинает обход и разминирование, двигаясь по спирали по часовой стрелке. При этом спираль постепеннь "закручивается" внутрь, захватывая постепенно все клетки прямоугольника. Разминирование заканчивается, когда проверены все клетки.
    Требуется написать программу, по которой для заданных испходных данных определяется количество поворотов, которые должен выполнить робот в процессе разминирования.
    Технические требования:
      Имя входного файла: input.txt
      Имя выходного файла: output.txt
    Формат входных данных:
      Входной файл содержит два целых числа, расположенных в одной строке в следующем порядке: n,m (1<=n, m<=32767). Числа в строке разделены пробелами.
    Формат выходных данных:
      Выходной файл должен содержать одно целое значение - количество поворотов.
    Пример:
      input.txt
      3 5
      output.txt
      4
№2. "Простая игра"
    Дед Мазай и заяц играют в очень простую игру. Перед ними - огромная куча из N одинаковых мороковок. Каждый из них во время своего хода может взять из этой кучи любое количество морковок, равное неотрицательной степени числа 2, т. е. 1, 2, 4,8, ... . Начинает игру либо Дед Мазай, либо заяц. Затем игроки ходят по очереди. Тот, кто возьмет последнюю морковку, тот и выигрывает.
    Требуется написать программу, которая при заданных исходных данных определяет победителя в этой игре. При этом следует учитывать, что игроки играют оптимально.
    Технические требования:
      Имя входного файла: input.txt
      Имя выходного файла: output.txt
    Формат входных данных:
      Входной файл содержит единственное целое положительное число N (N<=10 в степени 250), задающее число морковок в начале игры.
    Формат выходных данных:
      Выходной файл должен содержать в первой строке цифру '1', если выиграет тот, кто ходит первым, или цифру '2' - в противном случае. Если игру выиграл тот, кто хоидл первым, то во второй строке этого файла должно содержаться минимальное число морковок, которое должен взять игрок, выполнявший ход первым, чтобы гарантировать свою победу.
    Пример:
      input.txt
      8
      output.txt
      1
      2
На самом деле, задачи не такие сложные, как выглядят на первый взгляд. Кстати, уважаемые подписчики, если у Вас есть олимпиадные задачи, пришлите мне их пожалуйста, а то мне скоро нечего будет публиковать!!! Желательно с тестами и комментариями, на а если ни того, ни того нет, то можно просто условие. Буду очень благодарен.

   Ну и напоследок - лидеры нашего турнира:
1 место - Strory - 56 баллов;
2 место - GriFe - 48 баллов;
3 место - Piotr Korotkevich - 38 баллов.

Ну вот теперь точно всё. Жду Ваших решений и новых задач. Удачи!!!

На сегодня это всё. Пожелания и предложения пишите мне на e-mail: qsman1987@mail.ru

Рассылки Subscribe.Ru
Turbo Pascal для школьников    
   Рассылка 'Turbo Pascal для школьников'


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное