• Авторизация


два массива 05-02-2011 03:42 к комментариям - к полной версии - понравилось!


1.2.20. Даны два массива x[1] <= ... <= x[k] и y[1] <= ...
<= y[l]. Найти их "пересечение", т.е. массив z[1] <= ... <=
z[m], содержащий их общие элементы, причем кратность каждого
элемента в массиве z равняется минимуму из его кратностей в мас-
сивах x и y. Число действий порядка k+l.

1.2.21. Даны два массива x[1]<=...<=x[k] и y[1]<=...<=y[l]
и число q. Найти сумму вида x[i]+y[j], наиболее близкую к числу
q. (Число действий порядка k+l, дополнительная память - фиксиро-
ванное число целых переменных, сами массивы менять не разрешает-
ся.)
Указание. Надо найти минимальное расстояние между элемента-
ми x[1]<=...<=x[k] и q-y[l]<=..<=q-y[1], что нетрудно сделать в
ходе их слияния в один (воображаемый) массив.

1.2.22. (из книги Д.Гриса) Некоторое число содержится в
каждом из трех целочисленных неубывающих массивов x[1] <= ... <=
x[p], y[1] <= ... <= y[q], z[1] <= ... <= z[r]. Найти одно из
таких чисел. Число действий должно быть порядка p + q + r.
  • смотреть русские порно каналы бесплатно

  • список порно каналов

  • плеер +для просмотра порно каналов

  • порно каналы +с чатом

  • интернет канал порно смотреть бесплатно

  • русская ночь канал онлайн

  • порно каналы секс онлайн

  • порно online каналы бесплатно


  • Решение.

    p1:=1; q1=1; r1:=1;
    {инвариант: x[p1]..x[p], y[q1]..y[q], z[r1]..z[r]
    содержат общий элемент }
    while not ((x[p1]=y[q1]) and (y[q1]=z[r1])) do begin
    | if x[p1] z[r1]}
    writeln (x[p1]);

    1.2.23. Та же задача, только заранее не известно, существу-
    ет ли общий элемент в трех неубывающих массивах и требуется это
    выяснить (и найти один из общих элементов, если они есть).

    1.2.24. Элементами массива a[1..n] являются неубывающие
    массивы [1..m] целых чисел (a: array [1..n] of array [1..m] of
    integer; a[1][1] <= ... <= a[1][m], ..., a[n][1] <= ... <=
    a[n][m]). Известно, что существует число, входящее во все масси-
    вы a[i] (существует такое х, что для всякого i из [1..n]
    найдётся j из [1..m], для которого a[i][j]=x). Найти одно из та-
    ких чисел х.

    Решение. Введем массив b[1]..b[n], отмечающий начало "оста-
    ющейся части" массивов a[1]..a[n].

    for k:=1 to n do begin
    | b[k]:=1;
    end;
    eq := true;
    for k := 2 to n do begin
    | eq := eq and (a[1][b[1]] = a[k][b[k]]);
    end;
    {инвариант: оставшиеся части пересекаются, т.е. существует
    такое х, что для всякого i из [1..n] найдётся j из [1..m],
    не меньшее b[i], для которого a[i][j] = х; eq <=> первые
    элементы оставшихся частей равны}
    while not eq do begin
    | s := 1; k := 1;
    | {a[s][b[s]] - минимальное среди a[1][b[1]]..a[k][b[k]]}
    | while k <> n do begin
    | | k := k + 1;
    | | if a[k][b[k]] < a[s][b[s]] then begin
    | | | s := k;
    | | end;
    | end;
    | {a[s][b[s]] - минимальное среди a[1][b[1]]..a[n][b[n]]}
    | b [s] := b [s] + 1;
    | for k := 2 to n do begin
    | | eq := eq and (a[1][b[1]] = a[k][b[k]]);
    | end;
    end;
    writeln (a[1][b[1]]);
  • тв порно каналы бесплатно

  • порно онлайн 24 канала

  • немецкие порно каналы

  • 1.2.25. Приведенное решение предыдущей задачи требует по-
    рядка m*n*n действий. Придумать способ с числом действий порядка
    m*n.
    Указание. Придется пожертвовать симметрией и выбрать одну
    из строк за основную. Двигаясь по основной строке, поддерживаем
    такое соотношение: во всех остальных строках отмечен макси-
    мальный элемент, не превосходящий текущего элемента основной
    строки.

    1.2.26. (Двоичный поиск) Дана последовательность x[1] <=
    ... <= x[n] целых чисел и число a. Выяснить, содержится ли a в
    этой последовательности, т. е. существует ли i из 1..n, для ко-
    торого x[i]=a. (Количество действий порядка log n.)

    Решение. (Предполагаем, что n > 0.)

    l := 1; r := n+1;
    {если a есть вообще, то есть и среди x[l]..x[r-1], r > l}
    while r - l <> 1 do begin
    | m := l + (r-l) div 2 ;
    | {l < m < r }
    | if x[m] <= a then begin
    | | l := m;
    | end else begin {x[m] > a}
    | | r := m;
    | end;
    end;
    (Обратите внимание, что и в случае x[m] = a инвариант не наруша-
    ется.)
    Каждый раз r-l уменьшается примерно вдвое, откуда и вытека-
    ет требуемая оценка числа действий.
    Замечание.
    l + (r-l) div 2 = (2l + (r-l)) div 2 = (r+l) div 2.

    1.2.27. (Из книги Д.Гриса) Дан массив x: array [1..n] of
    array [1..m] of integer, упорядоченный по "строкам" и по
    "столбцам":
    x[i][j] <= x[i+1][j],
    x[i][j] <= x[i][j+1]
    и число a. Требуется выяснить, встречается ли a среди x[i][j].

    Решение. Представляя себе массив a как матрицу (прямо-
    угольник, заполненный числами), мы выберем прямоугольник, в ко-
    тором только и может содержаться a, и будем его сужать. Прямо-
    угольник этот будет содержать x[i][j] при 1<=i<=l и k<=j<=m.
    1 k m
    -----------------------------------
    1| |***********|
    | |***********|
    | |***********|
    l| |***********|
    |---------------------------------|
    | |
    n| |
    -----------------------------------
    (допускаются пустые прямоугольники при l = 0 и k = m+1).

    l:=n; k:=1;
    {l>=0, k<=m+1, если a есть, то в описанном прямоугольнике}
    while (l > 0) and (k < m+1) and (x[l][k] <> a) do begin
    | if x[l][k] < a then begin
    | | k := k + 1; {левый столбец не содержит a, удаляем его}
    | end else begin {x[l][k] > a}
    | | l := l - 1; {нижняя строка не содержит a, удаляем ее}
    | end;
    end;
    {x[l][k] = a или прямоугольник пуст }
    answer:= (l > 0) and (k < m+1) ;

    Замечание. Здесь та же ошибка: x[l][k] может оказаться не-
    определенным. (Её исправление предоставляется читателю.)

    1.2.28. (Московская олимпиада по программированию) Дан не-
    убывающий массив положительных целых чисел a[1] <= a[2] <=...<=
    a[n]. Найти наименьшее целое положительное число, не представи-
    мое в виде суммы нескольких элементов этого массива (каждый эле-
    мент массива может быть использован не более одного раза). Число
    действий порядка n.

    Решение. Пусть известно, что числа, представимые в виде
    суммы элементов a[1],...,a[k], заполняют отрезок от 1 до некото-
    рого N. Если a[k+1] > N+1, то N+1 и будет минимальным числом, не
    представимым в виде суммы элементов массива a[1]..a[n]. Если же
    a[k+1] <= N+1, то числа, представимые в виде суммы элементов
    a[1]..a[k+1], заполняют отрезок от 1 до N+a[k+1].
    вверх^ к полной версии понравилось! в evernote


    Вы сейчас не можете прокомментировать это сообщение.

    Дневник два массива | Ваньчиков_ВАня - Реальность... но с другого ракурса | Лента друзей Ваньчиков_ВАня / Полная версия Добавить в друзья Страницы: раньше»