Командная олимпиада по программированию Турнир Архимеда 2012 Произведение

Скачать презентацию Командная олимпиада по программированию Турнир Архимеда 2012 Произведение Скачать презентацию Командная олимпиада по программированию Турнир Архимеда 2012 Произведение

6134-solutions.ppt

  • Количество слайдов: 23

>Командная олимпиада по программированию Турнир Архимеда 2012 Командная олимпиада по программированию Турнир Архимеда 2012

>Произведение двух чисел оканчивается на ноль когда: Одно из чисел делится на 2, а Произведение двух чисел оканчивается на ноль когда: Одно из чисел делится на 2, а другое на 5 : 35×4=140 Одно из чисел делится на 10 : 3×10=30 Среди простых чисел: Ни одно не делится на 10 На 5 делится только само число 5 На 2 делится только само число 2 Наше число может заканчиваться ровно на один ноль или на какую-то другую цифру. Задача А. Простая игра

>Чтобы узнать, заканчивается ли наше произведение на ноль, нужно проверить, содержатся ли числа 2 Чтобы узнать, заканчивается ли наше произведение на ноль, нужно проверить, содержатся ли числа 2 и 5 на нашем отрезке от А до В: if (a <= 2) and (b >= 5) then writeln(1) else writeln(0); Задача А. Простая игра

>Попробуем сначала найти два свободных места рядом. Нам подходят места с такими номерами: нечетное Попробуем сначала найти два свободных места рядом. Нам подходят места с такими номерами: нечетное и следующее за ним четное. bought := false; sell1 := -1; sell2 := -1; for i := 1 to 4*n do if (not a[i]) and (i mod 2 = 1) and (i < 4*n) and (not a[i + 1]) then begin sell1 := i; sell2 := i + 1; bought := true; end; Задача B. Билеты на Сапсан

>Если мы не нашли свободных мест рядом(т.е. переменная bought имеет значение “false”), попробуем найти Если мы не нашли свободных мест рядом(т.е. переменная bought имеет значение “false”), попробуем найти свободные места через проход: if (not bought) then begin for i := 1 to 4*n do if (i mod 2 = 0) and (i div 2 mod 2 <> 0) and (not a[i]) and (not a[i + 2]) then begin sell1 := i; sell2 := i + 2; bought := true; end; end; Задача B. Билеты на Сапсан

>Если же нам не удалось найти и места через проход, найдём любые два свободных Если же нам не удалось найти и места через проход, найдём любые два свободных места: if (not bought) then begin for i := 1 to 4*n do if (not a[i]) then if (sell1 = -1) then sell1 := i else begin sell2 := i; break; end; end; Задача B. Билеты на Сапсан

>Какой же пароль выберет Вениамин?  Он должен начинаться на такую букву, на которую Какой же пароль выберет Вениамин? Он должен начинаться на такую букву, на которую начинается больше всего слов в словаре. Если таких букв несколько, то первой буквой пароля будет та, которая идёт позже всех в словаре. Из всех слов, начинающихся на выбранную букву, искомое слово должно быть в словаре последним. Найдём в нашем списке слов то, которое удовлетворяет описанным выше условиям. В массиве count будем хранить количество слов начинающихся на данную букву: в count[1] – на букву a, в count[2] - на букву b и т.д. Задача С. Надёжный пароль

>max := 0; for i := 1 to n do begin   readln(tmp); max := 0; for i := 1 to n do begin readln(tmp); index := ord(tmp[1]) - ord('a') + 1; inc(count[index]); if (count[index] >= max) then begin ans := tmp; max := count[index]; end; end; Задача С. Надёжный пароль

>Для решения этой задачи нам потребуется вспомнить признак делимости на 9: число делится на Для решения этой задачи нам потребуется вспомнить признак делимости на 9: число делится на 9, если сумма его цифр делится на 9. Для удобства будем представлять число строкой. В отдельной переменной будем хранить сумму цифр начального числа. Будем поочередно пытаться поменять каждую цифру так, чтоб после замены итоговая сумма делилась на 9. Задача D. Шпионские штучки

>Посчитаем сумму цифр исходного числа:  read(P);  str(p,key);  len := length(key); Посчитаем сумму цифр исходного числа: read(P); str(p,key); len := length(key); for i := 1 to len do begin val(key[i], t, err); inc(sum, t); end; Каждую из цифр можно попытаться заменить двумя способами: Отнять от неё некоторое число так, чтобы сумма цифр нового числа делилась на 9. sub := sum mod 9; Прибавить к ней некоторое число так, чтобы сумма цифр нового числа делилась на 9. add := 9 - (sum mod 9); Задача D. Шпионские штучки

>Задача  D. Шпионские штучки Задача D. Шпионские штучки

>Заметим следующую особенность: Если наше исходное число делится на 9, то нам придётся отнимать Заметим следующую особенность: Если наше исходное число делится на 9, то нам придётся отнимать и прибавлять к каждой из цифр 9. Таким образом нам нужно будет изменить переменные sub и add: if (sub = 0) then begin sub := 9; add := 9; end; Задача D. Шпионские штучки

>Теперь попробуем заменить все остальные цифры:   for i := 2 to len Теперь попробуем заменить все остальные цифры: for i := 2 to len do begin key1 := key; val(key1[i], t, err); if (t - sub >= 0) and (sub > 0)then begin t := t - sub; c := chr(ord('0') + t); key1[i] := c; writeln(key1); end; key1 := key; val(key1[i], t, err); if (t + add <= 9) and (add > 0) then begin t := t + add; c := chr(ord('0') + t); key1[i] := c; writeln(key1); end; end; Задача D. Шпионские штучки

>Максимальное число столбцов с отрицательной суммой – m-1. Как же заполнить таблицу? Заполним первые Максимальное число столбцов с отрицательной суммой – m-1. Как же заполнить таблицу? Заполним первые n-1 строку единицами. В последней строке все клетки, кроме клетки (n,m) заполним числами –n. В клетку (n,m) поставим число n*m. Задача E. Задача мастера дзен

>Максимальное число столбцов с отрицательной суммой – m-1. Как же заполнить таблицу? Заполним первые Максимальное число столбцов с отрицательной суммой – m-1. Как же заполнить таблицу? Заполним первые n-1 строку единицами. В последней строке все клетки, кроме клетки (n,m) заполним числами –n. В клетку (n,m) поставим число n*m. Пример(n=5, m=7) Задача E. Задача мастера дзен

>Заведем две переменные  fans – вычисленный на данный момент номер друга, к которому Заведем две переменные fans – вычисленный на данный момент номер друга, к которому поедет слава. tans – вычисленное на данный момент время отправления выбранной Славой электрички. Изначально fans := 0; tans := maxint; Для каждой электрички будем проверять следующие условия: Она отправляется раньше ,чем момент времени tans. Слава на неё успевает, т.е. она отправляется позже момента времени Т Задача F. Слава и электрички

>for i := 1 to M do begin   read(time, f);  if for i := 1 to M do begin read(time, f); if (time > T) and (time < tans) then begin tans := time; fans := f; end; end; Задача F. Слава и электрички

>Заведем два массива, в которых для каждого места запишем ближайшее к нему слева и Заведем два массива, в которых для каждого места запишем ближайшее к нему слева и справа занятое место. Выберем место у которого минимальное расстояние до левого и правого «соседа» будет максимальным Задача G. Метро

>Задача  G. Метро Задача G. Метро

>Нахождение лучшего места best := -1;  ans := 0;  for i := Нахождение лучшего места best := -1; ans := 0; for i := 1 to n do begin if (a[i]<>1) then begin if (i-l[i] <= r[i] – i) then cur := i – l[i] else cur := r[i] – i if (cur > best) then begin best := cur; ans := i; end; end; end; Задача G. Метро

>Для каждого из муравьев в массиве dest будем хранить его текущее направление: 1 – Для каждого из муравьев в массиве dest будем хранить его текущее направление: 1 – вверх 2 – вправо 3 – вниз 4 – влево В массивах lane и row будем для каждого муравья хранить его координаты (номер строки и столбца соответственно) Задача H. Муравьиная ферма

>Теперь в цикле будем моделировать поведение каждого из муравьев. Если муравей сейчас стоит на Теперь в цикле будем моделировать поведение каждого из муравьев. Если муравей сейчас стоит на закрашенной клетке for i := 1 to 3 do if a[lane[i], row[i]] <> 0 then begin case (dest[i]) of 1: begin dest[i] := 4; a[lane[i], row[i]] := 0; if row[i] <> 1 then dec(row[i]); end; 2: begin dest[i] := 1; a[lane[i], row[i]] := 0; if lane[i] <> 1 then dec(lane[i]); end; 3: begin dest[i] := 2; a[lane[i], row[i]] := 0; if row[i] <> m then inc(row[i]); end; 4: begin dest[i] := 3; a[lane[i], row[i]] := 0; if lane[i] <> n then inc(lane[i]); end; end; end; Задача H. Муравьиная ферма

>Если муравей сейчас стоит на незакрашенной клетке for i := 1 to 3 do Если муравей сейчас стоит на незакрашенной клетке for i := 1 to 3 do if a[lane[i], row[i]] = 0 then begin case (dest[i]) of 1: begin dest[i] := 2; a[lane[i],row[i]] := i; if row[i] <> m then inc(row[i]); end; 2: begin dest[i] := 3; a[lane[i],row[i]] := i; if lane[i] <> n then inc(lane[i]); end; 3: begin dest[i] := 4; a[lane[i],row[i]] := i; if row[i] <> 1 then dec(row[i]); end; 4: begin dest[i] := 1; a[lane[i],row[i]] := i; if lane[i] <> 1 then dec(lane[i]); end; end; end; Задача H. Муравьиная ферма