Форум программистов, компьютерный форум CyberForum.ru

Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
shatov05
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14
17.07.2014, 12:47     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #1
Задание:
В первой строке входных данных содержатся числа N и K (0NK100001). Во второй строке задаются N чисел первого массива, отсортированного по неубыванию, а в третьей строке – K чисел второго массива. Каждое число в обоих массивах по модулю не превосходит 2109.

Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному. Если таких несколько, выведите меньшее из них.
Пример:

Входные данные:
5 4
1 4 5 8 10
5 6 1 9

Выходные данные:
5
5
1
8

http://informatics.mccme.ru/mod/stat...w.php?id=192#1 - Это задача


C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
using namespace std;
const int n = 5 ; //двоичный поиск
int BinarySearch(int a[], int key)
{
    int left = 0, right = n, mid;
    while (left <= right)
    {
        mid = left + (right - left)/2;
        if (key < a[mid]) right = mid-1;
        else if (key > a[mid]) left = mid+1;
        else return mid;
    }
    return -1;
}
//главная функция
void main()
{
    setlocale(LC_ALL,"Rus");
    int i, key, k, n;
    int a[100001], b[100001];
    cin >> n >> k;
    cout<<"Первый массив: ";
    for (i = 0; i < n; i++) //заполнение и вывод массива
    { cin >> a[ i ]; }
    cout<<"Второй массив: ";
    for (int j = 0; j < k; j++){
        cin >> b[ j ];} 
        for ( int j = 0; j < k; j++)   {
            key = b[ j ] ; 
              for ( int i = 0; i < n; i++){ 
    if (BinarySearch(a, key)==-1) cout<<"\nЭлемент не найден";
    else cout<<"\nНомер элемента: "<<BinarySearch(a, key)+1;}}
    system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.07.2014, 12:47     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному
Посмотрите здесь:

Дано вещественное число R и массив вещественных чисел. Найти 2 элементы массива, которые наименее близки к данному числу R C++
C++ Сравнение (значение из ряда, наиболее близкое к полученному)
C++ Выведите на экран значения корней и квадратов каждого из элементов массива
Как создать отдельную функцию для каждого объекта класса C++
C++ Массив. Выведите на экран значения корней и квадратов каждого из элементов массива
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DarkerSigner
0 / 0 / 0
Регистрация: 17.07.2014
Сообщений: 4
17.07.2014, 17:35     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #21
Довольно громоздко, но работает
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
using namespace std;
 
int main()
{
    unsigned n=0;
    int k=0;
    cout<<"Enter N and K \n";
    cin>>n>>k;
    int massN[n];
    cout<<"Enter "<<n<<" element massN \n";
    for (int i=0;i!=n;i++)
    cin>>massN[i];
    cout<<"\n";
    int massK[k];
    cout<<"Enter "<<k<<" element massK \n";
    for (int i=0;i!=k;i++)
    cin>>massK[i];
    int temp1=0;
    int temp2=0;
    int massOut[k];
    for (int i=0;i!=k;i++)
        massOut[i]=-1;
    for (int i=0;i!=k;i++)
    {
        for(int j=0;j!=n;j++)
        {
            temp2=0;
            if (massK[i]!=massOut[i])
            if (massK[i]==massN[j])
            {
                massOut[i]=massN[j];
            }
            else
            {
                temp1=massK[i]-massN[j];
                if (temp1<0) temp1*=-1;
                if (massOut[i]!=-1)
                {
                    temp2=massK[i]-massOut[i];
                    if (temp2<0) temp2*=-1;
                    if (temp1<temp2) massOut[i]=massN[j];
                    if (temp1==temp2)
                    {
                        if (massN[j]<massOut[i]) massOut[i]=massN[i];
                    }
                }
                else    massOut[i]=massN[j];
            }
        }
    }
    for (unsigned i=0;i!=k;i++)
        cout<<massOut[i]<<" ";
    return 0;
}
P.S. ввод с клавиатуры, ввод из файла сам сделаешь, там не долго.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
shatov05
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14
17.07.2014, 23:23  [ТС]     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #22
много ошибок...
Kuzia domovenok
 Аватар для Kuzia domovenok
1883 / 1738 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
18.07.2014, 00:07     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #23
shatov05, каких конкретно? Ты в ошибках даже не разбираешься, что ли?!!
DarkerSigner
0 / 0 / 0
Регистрация: 17.07.2014
Сообщений: 4
18.07.2014, 01:23     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #24
shatov05, В чем же ? Я проверил алгоритм по тестовым данным, проходит, вывод верный.
shatov05
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14
18.07.2014, 15:07  [ТС]     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #25
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <iostream>
using namespace std;
const int n = 5 ; //двоичный поиск
int BinarySearch(int a[], int key)
{
    int left = 0, right = n, mid;
    while (left <= right)
    {
        mid = left + (right - left)/2;
        if (key < a[ mid ]) right = mid - 1;
        else if (key > a[ mid ]) left = mid + 1;
        else return mid;
    }
    return -1;
}
//главная функция
void main()
{
    setlocale(LC_ALL,"Rus");
    int i, key, k, n;
    int a[100001], b[100001];
    cin >> n >> k;
    cout<<"Первый массив: ";
    for (i = 0; i < n; i++) //заполнение и вывод массива
    { cin >> a[ i ]; }
    cout<<"Второй массив: ";
    for (int j = 0; j < k; j++){
        cin >> b[ j ];} 
        for ( int j = 0; j < k; j++)   {
            key = b[ j ] ; 
    if (BinarySearch(a, key)==-1) cout<<"\nЭлемент не найден"<< endl;
    else cout<<"\nНомер элемента: "<<a [ BinarySearch(a, key) ] << endl;}
    system("pause");
}
выводит ответ : 5 , не найден, 1, не найден..
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
18.07.2014, 15:16     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #26
я не догоняю, вы сейчас какую задачу решаете? ссылка которую ты дал, там другая задача, там надо для каждого числа найти наиболее близкое к нему, а не сказать, есть оно там или нет.
DarkerSigner
0 / 0 / 0
Регистрация: 17.07.2014
Сообщений: 4
18.07.2014, 17:04     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #27
shatov05, Ccылку на задачу скидывай правильно. Вот мы тебе и решили ту по которой ссылка, а не ту что хотел.
shatov05
0 / 0 / 0
Регистрация: 09.03.2014
Сообщений: 14
18.07.2014, 22:01  [ТС]     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #28
Цитата Сообщение от DarkerSigner Посмотреть сообщение
shatov05, Ccылку на задачу скидывай правильно. Вот мы тебе и решили ту по которой ссылка, а не ту что хотел.
вообще то я правильную ссылку кинул
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 22:15     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному
Еще ссылки по теме:

C++ В первую строку выходного файла выведите ровно N различных целых чисел
C++ Найти элемент массива, который наиболее близок к данному числу
Найти произведение двух последовательностей наиболее близкое к числу R C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
SlavaSSU
213 / 158 / 44
Регистрация: 17.07.2012
Сообщений: 580
18.07.2014, 22:15     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному #29
shatov05, так проверь.

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
#include <algorithm>
#include <vector>
 
using namespace std;
 
int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    vector<int> a;
    for(int i = 0; i < n; i++)
    {
        int val;
        scanf("%d", &val);
        a.push_back(val);
    }
 
    for(int p = 0; p < m; p++)
    {
        int val;
        scanf("%d", &val);
        int ans1 = 0, ans2 = 0;
        bool ok1 = false, ok2 = false;
        int it = (lower_bound(a.begin(), a.end(), val) - a.begin());
 
        if(it < a.size())
        {
            ans1 = a[it];
            ok1 = true;
        }
 
        if(it > 0)
        {
            it--;
            ans2 = a[it];
            ok2 = true;
        }
 
        if(ok1 && ok2)
        {
            if(abs(ans1 - val) < abs(ans2 - val))
                printf("%d\n", ans1);
            else
                printf("%d\n", ans2);
        }
        else
            if(ok1)
                printf("%d\n", ans1);
            else
                printf("%d\n", ans2);
    }
    return 0;
}
Yandex
Объявления
18.07.2014, 22:15     Для каждого из K чисел выведите в отдельную строку число из первого массива, наиболее близкое к данному
Ответ Создать тему
Опции темы

Текущее время: 18:35. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru