Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/56: Рейтинг темы: голосов - 56, средняя оценка - 4.54
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202

Элементы с максимальной разностью

23.07.2021, 08:58. Показов 10919. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Отношение
Дан массив a1,a2,…an. Необходимо выбрать в нём два элемента ai и aj, такие что i<j, и отношение aj/ai — максимально и больше 1.

Входные данные

В первой строке задано целое число 2 ≤n≤ 100 000 — количество элементов в массиве.

Во второй строке заданы n целых положительных чисел ai(1 ≤i≤n, 1 ≤ai≤ 5000).

Выходные данные

Выведите два числа — индексы элементов i и j. Если ответов несколько, то выведите любой из них.

Если ответа нет, то выведите два нуля, разделённых пробелом.

Примеры
Ввод
6
10 3 5 3 11 9
Вывод
2 5
Ввод
4
5 5 5 5
Вывод
0 0
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;
int main()
{
    int n;
    cin >> n;
    int a[100001];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    int imin = 0;
    int ibest = 0;
    int jbest = 1;
    for (int j = 2; j < n; ++j)
    {
        if (a[j - 1] < a[imin])
            imin = j - 1;
        if (a[j] - a[imin] > a[jbest] - a[ibest])
        {
            jbest = j;
            ibest = imin;
        }
    }
    if (a[ibest] - a[jbest] == 0)
    {
        cout << 0 << " " << 0;
  }
    else
    {
        cout << ibest + 1 << " " << jbest + 1<< endl;
    }
 
}
Помогите пожалуйста! Сайт пишет, что программа выдаёт неверный ответ
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
23.07.2021, 08:58
Ответы с готовыми решениями:

В массиве найти пару элементов с максимальной разностью
Задание 2. Составьте программу, отыскивающую среди пар элементов одномерного массива М те, разность между элементами которых есть...

Заменить каждый элемент массива разностью максимальной и минимальной из его цифр
Дан массив, содержащий 10 трехзначных чисел. Заменить каждый элемент массива разностью максимальной и минимальной из его цифр.

Функция находящая адрес последовательности с максимальной разностью между первым и последним элементом
Разработать функцию, которая возвращает указатель на начало такой последовательности из трех элементов целочисленного массива, в которой...

29
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
23.07.2021, 19:32
Студворк — интернет-сервис помощи студентам
ага, за авторами тем нужно глаз да глаз )
0
 Аватар для Новичок
1682 / 1098 / 489
Регистрация: 17.07.2012
Сообщений: 5,361
28.07.2021, 07:03
Кажется можно так,
min[i] = min на отрезке [0; i)

Ну а потом в цикле просто answer = max(answer, a[i] / min[i]).
Массив min кстати не нужен, в одном цикле можно все.
0
736 / 700 / 110
Регистрация: 29.05.2015
Сообщений: 4,282
28.07.2021, 07:39
По моему быстрее ничего не придумаешь, нужен полный перебор всех вариантов:

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
void Widget::press_pbtn_01()
{
    
    int i2, j2, x;
    int k = 0;
 
    QString str;
 
    QList<int> list;
    list << 10 << 3 << 5 << 3 << 11 << 9;
 
    for(int i = 0; i < list.length() - 1; i++)
        for(int j = i+1; j < list.length(); j++)
        {
            x = list.at(j) - list.at(i);
            if(x > k)
            {
                k = x;
                i2 = i;
                j2 = j;
            }
        }
 
    str = QString::number(i2+1) + "  " + QString::number(j2+1);
 
    ui->label_01->setText(str);
 
}
Миниатюры
Элементы с максимальной разностью  
0
7438 / 5030 / 2892
Регистрация: 18.12.2017
Сообщений: 15,692
28.07.2021, 10:50
dmitrii2000, так проходит тесты ?
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
#include <iostream>
using namespace std;
 
int main()
{
    int n, idx_i=0, idx_j=0;
    cin >> n;
    
      int *a = new int[n];
      
    for(int i = 0; i < n; i++)    
        cin >> a[i];
    
    double k, max=0.;    
    for(int i = 0; i < n-1; i++)
    {
        for(int j = i+1; j < n; j++)
        {
            k=(double)a[j]/a[i];
            if(k>1. && k>max) {max=k; idx_i=i; idx_j=j;}            
        }
    }
    
    if (max) cout << idx_i+1 << " " << idx_j+1 << "\n";
    else cout << 0 << " " << 0 << "\n";
    
    delete[]a;
    return 0;
}
0
2 / 2 / 0
Регистрация: 03.05.2020
Сообщений: 202
28.07.2021, 11:06  [ТС]
Программа выполнялась слишком долго
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
28.07.2021, 13:07
Фвтор учится где то за счет киберфорума ???
У меня же за один проход все ) И без массивов.
ему не судьба заменить stringstream на cin ???
Куда ему еще код писать.
0
Гвоздь Задиров
 Аватар для Folian
1719 / 1118 / 337
Регистрация: 25.01.2019
Сообщений: 2,946
28.07.2021, 22:43
Цитата Сообщение от SmallEvil Посмотреть сообщение
У меня же за один проход все ) И без массивов.
Мне нраица эта идея брать сходу. Мож она и самая правильная.
Но, когда я над этим задумывался, у меня была другая идея (если нужно - нарисую смысл):
Кликните здесь для просмотра всего текста
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
    size_t n = 100000;
    std::vector<std::pair<size_t, size_t>> arr(n);
    std::generate(arr.begin(), arr.end(), [](){ static size_t i = 0; return std::pair(rand()%5000 + 1, i++); });
 
 
    std::sort(arr.begin(), arr.end(), [](auto a, auto b){ return a.first < b.first; });
 
    std::pair<size_t, size_t> result(1, 1);
 
    auto left = arr.rend() - 1;
    auto right = left;
    while(true)
    {
        auto x = std::find_if(arr.rbegin(), right, [&left](auto a){ return left->second < a.second; });
        if(x == right) break;
        
        std::pair<size_t, size_t> temp(x->first, left->first);
        size_t a = result.second * temp.first;
        size_t b = result.first * temp.second;
        if(a > b)
        {
            result = temp;
            right = x;
        }
        --left;
    }
 
    std::cout << result.first <<  " " << result.second << "\n";


У меня для личного интереса вопрос: не могу понять какие входные будут являть наихудший случай для этой штуки
0
6 / 4 / 2
Регистрация: 14.03.2021
Сообщений: 62
08.08.2021, 16:18
Лучший ответ Сообщение было отмечено dmitrii2000 как решение

Решение

Может быть уже поздно, но решил поделиться своим решением

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
#include <iostream>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    int i = 0, j = 0, min = 0, num;
    cin >> min;
    double maxRatio = 0;
    for (int count = 1; count < n; count++)
    {
        cin >> num;
        if (num < min)
        {
            min = num;
            i = count;
        }
        else if (static_cast<double>(num / min) > maxRatio)
        {
            maxRatio = num / min;
            cout << maxRatio << endl;
            j = count;
        }
    }
 
    maxRatio == 0.0 ? cout << "0 0" : cout << i << ' ' << j;
 
    return 0;
}
1
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
08.08.2021, 20:58
AvRu, не вижу разницы от моего , 15 пост
но да автору нужно прямо в рот ложить.

Добавлено через 11 минут
Цитата Сообщение от AvRu Посмотреть сообщение
maxRatio = num / min;
к тому же тут ошибка
Цитата Сообщение от AvRu Посмотреть сообщение
else if (static_cast<double>(num / min) > maxRatio)
тут тоже
0
6 / 4 / 2
Регистрация: 14.03.2021
Сообщений: 62
09.08.2021, 12:22
Цитата Сообщение от SmallEvil Посмотреть сообщение
к тому же тут ошибка
Забыл, что сначала происходит вычисление, а уже потом преобразование. Такая же история со static_cast, получается вот так должно быть
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
#include <iostream>
 
using namespace std;
 
int main()
{
    int n;
    cin >> n;
    int i = 0, j = 0, min = 0, num;
    cin >> min;
    double maxRatio = 0;
    for (int count = 1; count < n; count++)
    {   
        cin >> num;
        if (num < min)
        {
            min = num;
            i = count;
        }
        else if ((double)num / min > maxRatio)
        {
            maxRatio = (double)num / min;
            j = count;
        }
    }
 
    maxRatio == 0.0 ? cout << "0 0" : cout << i << ' ' << j;
 
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.08.2021, 12:22
Помогаю со студенческими работами здесь

Ввести с клавиатуры логическое выражение для множеств с симметрической разностью и просто разностью, сам синтаксис?
Мне с клавиатуры нужно ввести множество по которому прога строит таблицу истинности, но я не знаю как мне ввести симметрическую разность,...

В массиве первый и последний нулевые элементы заменить разностью максимального и минимального элементов
Доброе время суток, нужно выполнить задание как минимум с 4 функциями, использовать интерфейс для ввода и вывода значений. Вот задание:...

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

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

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


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

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru