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

Задача в неделю. Олимпиадные задачи по информатике Разбор K-го занятия


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


Югорский НИИ информационных технологий

Югорский государственный университет

Телекоммуникационный проект "Задача в неделю"

Разбор K-го занятия

Найдем самое большое и самое маленькое числа в последовательности. Поделим разность между ними на количество чисел минус один. Это и будет разностью прогрессии, которая может быть построена из этих чисел. Если разность прогрессии равна 0, то есть максимальный и минимальный элементы равны, то тогда такую прогрессию построить можно. В противном случае необходимо проверить, встречаются ли все элементы арифметической прогрессии ровно по одному разу в исходной последовательности. Для этого в программе используется байтовый массив, в котором отмечаются номера встретившихся элементов.

 

  var

    n, m, min, max, h, i, i1, i2 : longint;

    a : array [0..32000] of byte;

    b : array [0..7] of byte;

    t : boolean;

begin

  assign(input,'input.txt'); reset(input);

  assign(output,'output.txt'); rewrite(output);

  b[0]:=1; b[1]:=2; b[2]:=4; b[3]:=8;

  b[4]:=16; b[5]:=32; b[6]:=64; b[7]:=128;

  n:=0; min:=2147483647; max:=0;

  while not eof do

  begin

    n:=n+1;

    read(m);

    if m<min then min:=m;

    if m>max then max:=m;

  end;

  if min=max then write(1) else

  begin

    h:=(max-min) div (n-1);

    max:=(max-min) mod (n-1);

    if max<>0 then write(0) else

    begin

      for i:=0 to (n-1) div 8 do a[i]:=0;

      reset(input); t:=true;

      while not eof do

      begin

        read(m);

        i:=(m-min) div h;

        t:=t and ((m-min) mod h = 0);

        i1:=i div 8;

        i2:=i mod 8;

        a[i1]:=a[i1]+b[i2];

      end;

      if n mod 8 <> 0 then

        for i:=n mod 8 to 7 do a[(n-1) div 8]:=a[(n-1) div 8]+b[i];

      for i:=0 to (n-1) div 8 do t:=t and (a[i]=255);

      if t then write(1) else write(0)

    end

  end

end.

 

Работы тестировались на 10 тестах (15 баллов за тесты и 5 премиальных баллов за все пройденные тесты). Эти тесты (кроме 3 последних, самых больших по объему) можно взять на сайте проекта http://attend.to/zvn (зеркало - http://krs.fio.ru/olimp).

 

Успехов!

Ведущий проекта, кандидат педагогических наук

Александр Владимирович Алексеев,

e-mail – aav@uriit.ru

 

PS. Внимание! Появился новый сборник задач по программированию.

Адрес в Интернете: http://www.geocities.com/alexprix/tasker3.zip

 

Оглавление:

  1. Алгоритмы
  2.  Элементы языков программирования
  3.  Язык программирования Паскаль
  4. . Язык программирования Java
  5.  Язык программирования Visual Basic
  6.  Ответы к задачам
  7.  Ссылки

 

Одной из целей, преследуемой при написании этого задачника, было научить учащихся быстро переключаться между языками программирования и облегчить овладение новыми языками программирования.



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

В избранное