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
























- Размер: 2.4 Mегабайта
- Количество слайдов: 23
Описание презентации Презентация solutions по слайдам
Командная олимпиада по программированию
Произведение двух чисел оканчивается на ноль когда: Одно из чисел делится на 2 , а другое на 5 : 35 × 4=140 Одно из чисел делится на 10 : 3× 10=30 Среди простых чисел: Ни одно не делится на 10 На 5 делится только само число 5 На 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” ) , попробуем найти свободные места через проход: 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. Он должен начинаться на такую букву, на которую начинается больше всего слов в словаре. 2. Если таких букв несколько, то первой буквой пароля будет та, которая идёт позже всех в словаре. 3. Из всех слов, начинающихся на выбранную букву, искомое слово должно быть в словаре последним. Найдём в нашем списке слов то, которое удовлетворяет описанным выше условиям. В массиве count будем хранить количество слов начинающихся на данную букву: в count[1] – на букву a, в count[2] — на букву b и т. д.
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.
Посчитаем сумму цифр исходного числа: 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); 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. Таким образом нам нужно будет изменить переменные sub и add: if (sub = 0) then begin sub : = 9; add : = 9; end;
Теперь попробуем заменить все остальные цифры: 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. Заполним первые n-1 строку единицами. 2. В последней строке все клетки, кроме клетки ( n, m ) заполним числами – n. 3. В клетку ( n, m ) поставим число n*m.
Максимальное число столбцов с отрицательной суммой – 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 – вычисленный на данный момент номер друга, к которому поедет слава. tans – вычисленное на данный момент время отправления выбранной Славой электрички. Изначально fans : = 0; tans : = maxint ; Для каждой электрички будем проверять следующие условия: 1. Она отправляется раньше , чем момент времени tans. 2. Слава на неё успевает, т. е. она отправляется позже момента времени Т
for 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 : = 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 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 – вверх 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 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 ;