11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
1

Прибавить к одному массиву другой так, чтобы получившиеся при этом числа шли по возрастанию

26.08.2017, 15:33. Показов 849. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Порядок цифр в обоих массивах менять запрещено.

В ответ нужно вывести индексы второго массива тех чисел, которые были сложены.

Дано:
n - длина первого массива.
m - длина второго массива.
a - первый массив.
b - второй массив.
2 <= n <= m <= 3000
прибавляем массив a к b
Пример:

Ввод:
3 5
21 12 19
10 20 10 20 10

Вывод:
1 2 4

Поясняю:
Складываем a[1] и b[1], получается 31. Складываем a[2] и b[2], получается 32. Складываем a[3] и b[4], получается 39. Условие выполнено, последовательность возрастает (a[1] + b[1] < a[2] + b[2] < a[3] + a[3]), ответ(индексы массива b: 1 2 4.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.08.2017, 15:33
Ответы с готовыми решениями:

Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию
Объясните пожалуйста как можно подробнее,как работает эта программа?(желательно все циклы и строки)...

Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию
Из массива удалить минимальное число элементов так, чтобы оставшиеся шли по возрастанию. на языке...

Прибавить к первой цифре числа 2 и вывести получившиеся число
Для двухзначных чисел всё ОК, о как введёшь однозначное или больше чем двухзначное, начинается...

Расположть числа в массиве так, чтобы первыми шли отрицательные числа, затем положительные
Массив А содержит 100 чисел,из которых 50 чисел положительных, а 50- отрицательных. Расположите их...

5
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
26.08.2017, 16:09 2
SaynorPRO, Я ничерта не понял условие задачи.
Цитата Сообщение от SaynorPRO Посмотреть сообщение
Складываем a[1] и b[1], получается 31. Складываем a[2] и b[2], получается 32. Складываем a[3] и b[4], получается 39
Какого хрена ты складываешь первый с первым, потом второй со вторым, а потом каким-то магическим образом третий с четвертым? Почему это не объяснено?

Цитата Сообщение от SaynorPRO Посмотреть сообщение
Условие выполнено, последовательность возрастает (a[1] + b[1] < a[2] + b[2] < a[3] + a[3])
Опять, первый с первым, второй со вторым, и уже третий с самим собой. Бред какой-то.

Условие задачи какой-то пьяный писал
1
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
26.08.2017, 17:09  [ТС] 3
Bretbas,
Цитата Сообщение от Bretbas Посмотреть сообщение
Какого хрена ты складываешь первый с первым, потом второй со вторым, а потом каким-то магическим образом третий с четвертым? Почему это не объяснено?
Почему магическим? Я этим примером хотел показать, как можно двигать числа. Я просто не знаю, как это назвать. Двигать числа можно, но сам порядок менять нельзя. Представь, что первый массив - это участники олимпиады и их рост, а второй - пьедесталы и их высота. И вот их нужно поставить по росту с учётом пьедесталов, но порядок выхода этих людей нельзя менять, они должны выходить ровно один за другим и каждый должен пройти мимо уже стоящих на пьедестале. Можно ещё сказать, что индексы - это порядок их выхода, который нельзя менять.

Картинка, чтобы было понятнее
Прибавить к одному массиву другой так, чтобы получившиеся при этом числа шли по возрастанию


Цитата Сообщение от Bretbas Посмотреть сообщение
Опять, первый с первым, второй со вторым, и уже третий с самим собой. Бред какой-то.
Тут извиняюсь, описался, a[3] + b[4] конечно же.
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
26.08.2017, 19:04 4
SaynorPRO, Да, это я понял, но я не пойму, почему в массиве 10 20 10 20 10, ты вторую десятку(10) пропускаешь? Я так подозреваю, что это делается для того, чтобы условие всегда выполнялось, чтобы сумма первых элементов двух массивов, была больше суммы вторых двух элементов, а вот в третьем случае, сумма 10 + 19 меньше, чем предыдущая сумма, но так как условие должно выполняться, мы пропускаем этот "пьедистал" и переходим к следующему, пока сумма не будет больше чем предыдущая? Так?

Добавлено через 1 час 47 минут
SaynorPRO, Вот попробуй так:
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
56
57
58
59
60
61
62
63
64
#include <iostream>
#include <string>
#include <vector>
#include <map>
 
void fillArray( std :: vector<int>& array, unsigned int size )
{
    array.resize( size );
    for( int i = 0; i < size; i++ )
    {
        int value;
        std :: cout << "Input the" + std :: to_string( i ) + "item of array" << std :: endl;
        std :: cin >> value;
        array[i] = value;
    }
}
 
int main()
{
    unsigned int n, m;
 
    // Вводим размеры массивов
    std :: cout << "Input a size of the first array: ";
    std :: cin >> n;
    std :: cout << std :: endl;
    std :: cout << "Input a size of the second array: ";
    std :: cin >> m;
    std :: cout << std :: endl;
 
    // Проверяем правильность ввода данных
    if( ( n < 2 ) || ( n > m ) || ( m > 3000 ) )
    {
        std :: cout << "Input error!";
        return -1;
    }
 
    // Объявляем массивы
    std :: vector<int> array1;
    std :: vector<int> array2;
 
    // Заполняем массивы
    fillArray( array1, n );
    fillArray( array2, m );
 
    std :: vector<std :: pair<unsigned int, int>> sums;
    sums.resize( n );
    sums[0] = std :: pair<unsigned int, int>( 0 + 1, array1[0] + array2[0] );
 
    for( int i = 1; i < n; i++ )
    {
        for( int j = i; j < m; j++ )
        {
            int sum = array1[i] + array2[j];
            if( sum > sums[i - 1].second )
            {
                sums[i] = std :: pair<unsigned int, int>( j + 1, array1[i] + array2[j] );
                break;
            }
        }
    }
 
    for( auto index : sums )
        std :: cout << index.first << " ";
}
Учти только одно. Ты мне дал неполное условие задачи.
К примеру, можно ли сортировать массивы? Я так понял, что нельзя. А если их скопировать в другие переменные и там отсортировать?
Что, если будут такие входные данные:
3 3
5 9 10
10 5 7

В моем коде, он выдаст 1, 3, 3. Объясню почему: В самом начале 5 + 10 = 15. Запоминаем это и соответственно запоминаем индекс 0 + 1. Затем 9 + 5 = 14. Проверяем 14>чем предыдущая сумма? Тоесть 14>15? Нет не больше. Следовательно переходим к следующему элементу второго массива, тоесть 7. Снова 9 + 7 = 16. 16>чем предыдущая сумма? Тоесть 16>15? Да больше, значит запоминаем эту сумму и соответственно запоминаем индекс 2 + 1 = 3. Переходим к следующему элементу первого массива. 10 + что? Вот тут непонятно, можно ли использовать слагаемое, которое было ранее использовано для суммы. Если можно, то 10 + 7 = 17. Проверяем 17> чем предыдущая сумма? Тоесть 17>16. Да больше. Значит запоминаем эту сумму и соответственно запоминаем индекс 2 + 1 = 3.
Вывод 1, 3, 3.
Если нельзя использовать слагаемое, которое было ранее использовано в сумме, то чуть сложнее все будет.

Еще ты не объяснил, что будет, если сумма некоторых элементов из первого и второго массива не будет удовлетворять условиям, которых нужно придерживаться?

Вообщем задача полностью не раскрыта, соответственно нельзя сделать ее до конца
1
11 / 11 / 5
Регистрация: 05.10.2016
Сообщений: 122
26.08.2017, 19:17  [ТС] 5
Bretbas, больше спасибо за усилия, отблагодарил как мог(наставил плюсов), но у меня так и не получилось правильно донести до тебя смысл задачи. Это олимпиадная задача, поэтому я попытался описать тебе только математическую модель. Полное условие тут, задача под номером 2. Прочитай, там несложно разобраться. После этого, я уверен, тебе станет ясно.
0
Каждому свое
533 / 219 / 81
Регистрация: 05.08.2013
Сообщений: 1,614
26.08.2017, 19:45 6
SaynorPRO, Прочел. Вообщем вот твое решение:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <iostream>
#include <string>
#include <vector>
 
void fillArray( std :: vector<int>& array, unsigned int size )
{
    array.resize( size );
    for( int i = 0; i < size; i++ )
    {
        int value;
        std :: cout << "Input the " + std :: to_string( i ) + " item of array" << std :: endl;
        std :: cin >> value;
        array[i] = value;
    }
}
 
int main()
{
    unsigned int n, m;
 
    // Вводим размеры массивов
    std :: cout << "Input a size of the first array: ";
    std :: cin >> n;
    std :: cout << std :: endl;
    std :: cout << "Input a size of the second array: ";
    std :: cin >> m;
    std :: cout << std :: endl;
 
    // Проверяем правильность ввода данных
    if( ( n < 2 ) || ( n > m ) || ( m > 3000 ) )
    {
        std :: cout << "Input error!";
        return -1;
    }
 
    // Объявляем массивы
    std :: vector<int> array1;
    std :: vector<int> array2;
 
    // Заполняем массивы
    fillArray( array1, n );
    fillArray( array2, m );
 
    // Весь процесс поиска здесь:)
    std :: vector<std :: pair<unsigned int, int>> sums;
    sums.push_back( std :: pair<unsigned int, int>( 0 + 1, array1[0] + array2[0] ) );
    bool fl = false;
    for( int i = 1; i < n; i++ )
    {
        int index = sums[sums.size() - 1].first;
        if( index >= m )
        {
            fl = true;
            break;
        }
 
        for( int j = index; j < m; j++ )
        {
            int sum = array1[i] + array2[j];
            if( sum > sums[i - 1].second )
            {
                sums.push_back( std :: pair<unsigned int, int>( j + 1, array1[i] + array2[j] ) );
                break;
            }
        }
    }
 
    // Не получается нихрена
    if( ( fl ) || ( sums.size() != n ) )
    {
        std :: cout << "-1";
        return -1;
    }
 
    // Все ровно :)
    for( auto index : sums )
        std :: cout << index.first << " ";
}
Заполнение с массивов с файла сам сделаешь. Единственное, код писал можно сказать на коленке, поэтому может быть можно где-нибудь оптимизировать.
0
26.08.2017, 19:45
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.08.2017, 19:45
Помогаю со студенческими работами здесь

Сортировка массива вставкой, чтобы четные числа шли по возрастанию, а нечетные по убыванию
Всем привет! Есть задача отсортировать массив таким образом, чтобы четные числа шли в нем по...

Переписать файл так, чтобы сначала шли положительные, потом отрицательные числа
Подскажите, пожалуйста, нужно ли что-то поменять или добавить в программу? Дан файл f,...

Преобразовать массив так, чтобы сначала шли нечетные числа а потом четные
Помогите дописать код , ниже задается одномерный массив его диапозон и значение задается с...

Преобразовать массив так, чтобы сначала шли четные числа, а потом – нечетные
Друзья !есть такая задачка:Задан массив А из N чисел. Преобразовать этот массив так, чтобы сначала...

Содержимое массива отсортировать так, чтобы числа в каждой строке шли в порядке возрастания
люди, помогите. дан массив 10 x 10 и нужно его содержимое отсортировать так, чтобы числа в каждой...

Переписать компоненты файла f в файл g так, чтобы в файле g числа шли в заданном порядке
Дан файл F, содержащий целые числа. Файл F содержит столько же отрицательных чисел, сколько...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru