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

solutions.ppt

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

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

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

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

Задача B. Билеты на Сапсан Попробуем сначала найти два свободных места рядом. Нам подходят Задача B. Билеты на Сапсан Попробуем сначала найти два свободных места рядом. Нам подходят места с такими номерами: нечетное и следующее за ним четное. bought : = false; sell 1 : = -1; sell 2 : = -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 sell 1 : = i; sell 2 : = i + 1; bought : = true; end;

Задача B. Билеты на Сапсан Если мы не нашли свободных мест рядом(т. е. переменная Задача B. Билеты на Сапсан Если мы не нашли свободных мест рядом(т. е. переменная 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 sell 1 : = i; sell 2 : = i + 2; bought : = true; end;

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

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

Задача С. Надёжный пароль max : = 0; for i : = 1 to Задача С. Надёжный пароль 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;

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

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

Задача D. Шпионские штучки Попробуем заменить первую цифру : Пробуем отнять: Пробуем прибавить key Задача D. Шпионские штучки Попробуем заменить первую цифру : Пробуем отнять: Пробуем прибавить key 1: =key; val(key 1[1], t, err); if (t - sub > 0) and (sub > 0) then begin t : = t - sub; c : = chr(ord('0') + t); key 1[1] : = c; writeln(key 1); end; key 1: =key; val(key 1[1], t, err); if( t + add <= 9) and (add > 0) then begin t : = t + add; c : = chr(ord('0') + t); key 1[1] : = c; writeln(key 1); end;

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

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

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

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

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

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

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

Задача G. Метро Нахождение ближайших занятых мест: Слева: last : = -maxint; for i Задача G. Метро Нахождение ближайших занятых мест: Слева: last : = -maxint; for i : = 1 to n do if (a[i] = 1) then last : = i else l[i] : = last; Справа last : = maxint; for i : = n downto 1 do if (a[i] = 1) then last : = i else r[i] : = last;

Задача G. Метро Нахождение лучшего места best : = -1; ans : = 0; Задача G. Метро Нахождение лучшего места 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;

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

Задача H. Муравьиная ферма Теперь в цикле будем моделировать поведение каждого из муравьев. Если Задача 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;

Задача H. Муравьиная ферма Если муравей сейчас стоит на незакрашенной клетке for i : Задача H. Муравьиная ферма Если муравей сейчас стоит на незакрашенной клетке 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;