Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Бинарный поиск. 
:(
    Опции темы
ferq
  Дата 9.1.2006, 22:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Даны две последовательности A1, A2,..., AN и B1, B2, ..., BM. Ваша задача вывести все общие элементы этих последовательностей в возрастающем порядке.

Входные данные
В первой строке входного файла записаны числа N и M (1 <= N <= 10^3, 1 <= M <= 10^5). Во второй строке записано N чисел, элементы последовательности A. В третьей строке записаны элементы последовательности B (M чисел). Элементы последовательностей разделяются пробелами, гарантируется, что они не превосходят 10^6 по абсолютной величине.

Выходные данные
В первой строке выходного файла выведите число K -- количество различных общих элементов в этих двух последовательностях. Во второй строке выведите K различных общих элементов в возрастающем порядке.

Пример

Ввод

6 8
1 2 5 2 7 3
9 3 4 2 2 1 9 7


Вывод

4
1 2 3 7

Нужен код на pascale или хоть намекните как решать.
  Вверх
Fin
Дата 10.1.2006, 01:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дракон->Спать();
**


Профиль
Группа: Участник
Сообщений: 687
Регистрация: 4.1.2006

Репутация: 1
Всего: 10



Я бы эту задачу чуть по другому решал бы. Ну раз бинарный поиск.
Я написал маленький пример на С++. Извини на паскале уже давно не писал.
Первое что нужно делать, это отсортировать массив A по возрастаюшей. Да кстати ни в коем случае не используй пузырек для этого. 10^3 ээлементов это довольно много для него уже.
Я написал в обших чертах, чтобы понять. Все красивости делай сам. Прочитать подробно про этот алгоритм Д.Кнут "Исскуство программирования" том 3. начиная с 442 страници.
Код

#include <iostream.h>
int main()
{
    const int n=7;
    const int m=13;
    int A[n]={1, 2, 3, 5, 7, 10, 15}; //Massiv uge otsortirovan :)
    int B[m]={9, 3, 4, 2, 1,  7, 8, 15, 16, 22, 10, 25, 6 };
    int levU; int levD;  //Granica verhnya i nignaya
    int beg;
    for (int i=0; i<m; i++)                       // Cikl perebora massiva  B
    {
        levD=0; levU=n-1;                         //Nastraivaem granitsi massiva A
        beg=levD+(levU-levD)/2;
        while (((levU-levD)>1) && (B[i] != A[beg]))              //Sobstvenno poisk
        {
            if (B[i]>A[beg]) levD=beg;
            else levU=beg;
            beg=levD+(levU-levD)/2;
        }
        //Tuta proveryaem udachniy poisk ili net
        if (B[i] == A[levD]) cout << B[i] <<" ";
        if (B[i] == A[levU]) cout << B[i] <<" ";
        if ((beg !=levD) && (beg != levU) && (B[i] == A[beg])) cout << B[i] <<" ";
    }
    cout << endl;
    return 0;
}


Это сообщение отредактировал(а) Fin - 10.1.2006, 01:23


--------------------
Пролетал мимо.
PM MAIL   Вверх
podval
Дата 10.1.2006, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 2
Всего: 62



Модератор: Тема перемещена из раздела "Алгоритмы"
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.0598 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.