Презентация solutions

Скачать презентацию  solutions Скачать презентацию solutions

solutions.ppt

  • Размер: 2.4 Mегабайта
  • Количество слайдов: 23

Описание презентации Презентация solutions по слайдам

Командная олимпиада по программированию  Командная олимпиада по программированию

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

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

Попробуем сначала найти два свободных места рядом. Нам подходят места с такими номерами:  нечетное иПопробуем сначала найти два свободных места рядом. Нам подходят места с такими номерами: нечетное и следующее за ним четное. 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;

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

Если же нам не удалось найти и места через проход, найдём любые два свободных места :Если же нам не удалось найти и места через проход, найдём любые два свободных места : 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;

 Какой же пароль выберет Вениамин?  1. Он должен начинаться на такую букву, на которую Какой же пароль выберет Вениамин? 1. Он должен начинаться на такую букву, на которую начинается больше всего слов в словаре. 2. Если таких букв несколько, то первой буквой пароля будет та, которая идёт позже всех в словаре. 3. Из всех слов, начинающихся на выбранную букву, искомое слово должно быть в словаре последним. Найдём в нашем списке слов то, которое удовлетворяет описанным выше условиям. В массиве 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;

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

Посчитаем сумму цифр исходного числа:  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; Каждую из цифр можно попытаться заменить двумя способами: 1. Отнять от неё некоторое число так, чтобы сумма цифр нового числа делилась на 9. sub : = sum mod 9; 2. Прибавить к ней некоторое число так, чтобы сумма цифр нового числа делилась на 9. add : = 9 — (sum mod 9);

Попробуем заменить первую цифру : Пробуем отнять: key 1: =key;  val(key 1[1], t, err); Попробуем заменить первую цифру : Пробуем отнять: 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 0) then begin t : = t + add; c : = chr(ord(‘0’) + t); key 1[1] : = c; writeln(key 1); end;

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

Теперь попробуем заменить все остальные цифры: for i : = 2 to len do begin keyТеперь попробуем заменить все остальные цифры: 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 0) then begin t : = t + add; c : = chr(ord(‘0’) + t); key 1[i] : = c; writeln(key 1); end;

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

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

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

for i : = 1 to M do begin read(time, f); if (time  T) andfor i : = 1 to M do begin read(time, f); if (time > T) and (time < tans) then begin tans : = time; fans : = f; end;

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

Нахождение ближайших занятых мест: Слева: last : = - maxint ;  for i : =Нахождение ближайших занятых мест: Слева: 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;

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

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

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

Если муравей сейчас стоит на незакрашенной клетке for i : = 1 to 3 do ifЕсли муравей сейчас стоит на незакрашенной клетке 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 ;